对于给定的时钟触发器,我如何检索关联的文档/电子表格



我已经构建了一个Google Sheets插件,用户可以在其拥有的任何电子表格上添加基于时间的触发器。触发器随后调用一个函数,该函数从API中检索一些内容并将其添加到相应的电子表格中。

它首先调用PropertiesService.getDocumentProperties()函数并检索一些关于要添加到电子表格中的内容的信息。此信息最初是在创建触发器时设置的。因此,基于时间的触发器似乎总是知道检索与创建它们的文档相关联的属性,而无需显式指定文档ID(getDocumentProperties()甚至不支持参数(。

我遇到的问题是,给定一个触发器列表,例如从getProjectTriggers()循环,我如何判断每个触发器与哪个电子表格关联/从哪个电子表格创建?

PS:我尝试过getTriggerSourceId(),但对于时钟触发器,它总是返回null(这很奇怪,因为这将是检索信息的完美函数(。

编辑:这是一个代码示例:

function setTrigger(form) {
// Use the current document properties to store what kind of data should the trigger fetch
const props = PropertiesService.getDocumentProperties();
// Set Properties
const currentSpreadsheetId = SpreadsheetApp.getActiveSpreadsheet().getId();
props.setProperty('backupSpreadsheet', currentSpreadsheetId);
props.setProperty('triggerValue1', form.t1);
props.setProperty('triggerValue2', form.t2);
props.setProperty('triggerValue3', form.t3);
// Create Clock Trigger to run every day.
const triggerId = ScriptApp.newTrigger('getData')
.timeBased()
.atHour(8)
.everyDays(1)
.create()
.getUniqueId();
}
function getData() {
// Get the document properties where the trigger was created
const props = PropertiesService.getDocumentProperties();
// Set up object to store backup info for data retrieval
const data = {};
// Get spreadsheet id and trigger config from properties
data.spreadsheet = props.getProperty('backupSpreadsheet');
data.t1 = props.getProperty('triggerValue1');
data.t2 = props.getProperty('triggerValue2');
data.t3 = props.getProperty('triggerValue3');
// Open the spreadsheet and write the data to it
const ss = SpreadsheetApp.openById(data.spreadsheet);
writeDataToSpreadsheet(ss, data);
}

用户可以使用附加UI(侧边栏功能(在他们选择的任何电子表格上使用HTML表单来启用这样的触发器。表单数据被传递到活动电子表格的文档属性,这样触发器将能够获取运行所需的任何配置数据(PropertiesService.getDocumentProperties()函数总是返回最初创建触发器的文档的属性,因此触发器肯定与该电子表格相关联(。因此,用户可以有多个时钟触发器,每个电子表格只能有一个。

问题:

我认为没有直接的方法来检索它,因为getTriggerSourceId()为时间驱动的触发器返回null,如方法文档中所示。

这是因为,与其他类型的触发器不同,导致该触发器触发的事件与任何文档都无关(与表单编辑、表单提交等不同(,这就是TriggerSource的作用:

一个枚举,表示导致触发器触发的事件的源。

解决方法:

尽管如此,作为一种变通方法,您可以使用脚本属性来存储与安装触发器时哪个触发器连接到每个电子表格相关的信息,并在以后检索它。

代码示例:

function setTrigger() {
const spreadsheetId = SpreadsheetApp.getActive().getId();
const docProps = PropertiesService.getDocumentProperties();
docProps.setProperty("spreadsheetId", spreadsheetId);
const triggerId = ScriptApp.newTrigger("getData")
.timeBased()
.atHour(8)
.everyDays(1)
.create()
.getUniqueId();
const scriptProps = PropertiesService.getScriptProperties();
const newProp = {triggerId, spreadsheetId};
let triggerIdsProps = scriptProps.getProperty("triggerIds");
if (triggerIdsProps) {
triggerIdsProps = JSON.parse(triggerIdsProps);
triggerIdsProps.push(newProp);    
} else {
triggerIdsProps = [newProp];
}
scriptProps.setProperty("triggerIds", JSON.stringify(triggerIdsProps));
}
function getSpreadsheetTrigger() {
const spreadsheetId = SpreadsheetApp.getActive().getId();
const scriptProps = PropertiesService.getScriptProperties();
const triggerIdsProps = JSON.parse(scriptProps.getProperty("triggerIds"));
const triggerId = triggerIdsProps.find(triggerProp => triggerProp["spreadsheetId"] === spreadsheetId)["triggerId"];
const projectTriggers = ScriptApp.getProjectTriggers();
const trigger = projectTriggers.find(trigger => trigger.getUniqueId() == triggerId);
return trigger;
}

最新更新