Google apps script 谷歌脚本-触发器和功能在不同的工作表

Google apps script 谷歌脚本-触发器和功能在不同的工作表,google-apps-script,triggers,Google Apps Script,Triggers,我需要: 创建新图纸 调用main函数 设置将调用主函数的触发器 基本上: function new_campaign(){ var sheet_name = new_sheet(); main_function(sheet_name); trigger(sheet_name); } 使用单个工作表不会有问题,因为我可以在工作表名称之前设置全局变量。 问题是,我必须创建多个工作表,所有工作表都必须继续工作 我创建了新工作表的函数,以便它返回工作表的名称,这样我就可以

我需要:

  • 创建新图纸
  • 调用main函数
  • 设置将调用主函数的触发器
基本上:

function new_campaign(){
    var sheet_name = new_sheet();
    main_function(sheet_name);
    trigger(sheet_name);
}
使用单个工作表不会有问题,因为我可以在工作表名称之前设置全局变量。 问题是,我必须创建多个工作表,所有工作表都必须继续工作

我创建了新工作表的函数,以便它返回工作表的名称,这样我就可以调用传递工作表的main_函数。 不幸的是,扳机并不是那么容易,因为我不知道如何传球

function trigger(sheetName) {
  ScriptApp.newTrigger("main_function")
  .timeBased()
  .everyMinutes(1)
  .create();
}
更新

正如建议的那样,我尝试使用
PropertiesService
将触发器的ID映射到我需要在函数中使用的参数(在我的例子中是sheetName)

更新2

我试图从事件对象提取触发器ID,以从
脚本属性
获取sheetName。现在我的
main_函数
如下所示

function main_function() {
    var e = arguments[0];
    var scriptProperties = PropertiesService.getScriptProperties();
    var sheetName = scriptProperties.getProperty(e.triggerUid);
}

解决方案

有一个函数处理其他函数和触发器:

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
}
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);
    //...
}
和主要功能:

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
}
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);
    //...
}

您不能将参数传递给触发函数-Google会这样做(作为传递事件对象的一部分)。但是,您可以使用触发器ID和PropertiesService在ID和它应该使用的工作表之间存储映射。谢谢您的回答!:)我发现了这个,但我不知道如何在我的案例中使用它。如何获取触发器ID以及如何将其映射到工作表?对不起,我是新来的。代码(也简化了)将非常感谢!:)从创建的触发器中获取触发器ID:通过设置键和值使用
PropertiesService
——值将是函数所需的参数,键是触发器ID。在触发函数中,使用事件对象并在事件对象中查找触发器ID的存储值。关于触发器、事件对象和属性服务的应用程序脚本文档应该具备编写脚本所需的功能-一旦您有了这些功能,就可以获得更好的帮助。非常感谢!非常感谢你的帮助!我用更改的代码更新了原始问题。不过,仍然存在一个问题。您说过要使用事件对象,所以我应该执行类似的操作:
event.triggerUid
问题是我不知道如何找到事件对象,文档以接收事件对象为例。如何调用事件对象?谢谢!!:)您的触发函数(例如,
main_函数
onEdit
等)自动接收事件对象作为输入参数。您可以在触发函数中将其称为
参数[0]
,或者,如果您指定了参数名称,则可以将其称为该参数名称(例如
函数foo(evobj){/**code*/}
中的
evobj
)。谷歌将在每次触发器激活时创建事件对象。