我需要:
- 创建一个新工作表
- 调用主函数
- 设置一个将调用 main 函数的触发器
基本上是这样的:
function new_campaign(){
var sheet_name = new_sheet();
main_function(sheet_name);
trigger(sheet_name);
}
对于单个工作表,不会有问题,因为我可以在工作表名称之前将其设置为全局变量。
问题是我必须创建多个工作表并且所有工作表都必须继续工作。
我创建了新工作表的函数,以便它返回工作表的名称,这样我就可以调用主功能传递纸张。
不幸的是,触发器并不那么容易,因为我不明白如何传递这张表。
function trigger(sheetName) {
ScriptApp.newTrigger("main_function")
.timeBased()
.everyMinutes(1)
.create();
}
UPDATE
按照建议,我尝试使用PropertiesService
将触发器的 ID 与我需要在函数中使用的参数映射(在我的例子中是sheetName)
function trigger(sheetName) {
var triggerID = ScriptApp.newTrigger("main_function")
.timeBased()
.everyMinutes(1)
.create()
.getUniqueId();
var scriptProperties = PropertiesService.getScriptProperties();
scriptProperties.setProperty(triggerID, sheetName);
}
UPDATE 2
我尝试从事件对象中提取触发器 ID,以从scriptProperties
。现在我的main_function
看起来像这样
function main_function() {
var e = arguments[0];
var scriptProperties = PropertiesService.getScriptProperties();
var sheetName = scriptProperties.getProperty(e.triggerUid);
}
SOLUTION
有一个函数可以处理其他函数和触发器:
function new_campaign(){
var sheet_name = new_sheet(); //function to create a new sheet
main_function(); //to execute main_function without delay the first time
trigger(sheet_name); //set the trigger
}
触发功能:
function trigger(sheetName) {
var triggerID = ScriptApp.newTrigger("main_function")
.timeBased()
.everyMinutes(1)
.create()
.getUniqueId();
var scriptProperties = PropertiesService.getScriptProperties();
scriptProperties.setProperty(triggerID, sheetName); //association between sheetName and triggerID to call it back
}
和 main_function 函数:
function main_function() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheetName;
var e = arguments[0]; //argument[0] contains the event object
//if else to handle the first case
//if the event object is defined, it extract the sheetName associated to the triggerID in the ScriptProperties
//otherwise take the active sheet
if (!(e == undefined)){
var scriptProperties = PropertiesService.getScriptProperties();
sheetName = scriptProperties.getProperty(e.triggerUid);
}else{
var sheet = ss.getActiveSheet();
sheetName = sheet.getSheetName();
}
var sheet = ss.getSheetByName(sheetName);
//...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)