【问题标题】:Google Scripts - trigger and function in different sheetsGoogle Scripts - 在不同的工作表中触发和运行
【发布时间】:2018-08-07 09:33:37
【问题描述】:

我需要:

  • 创建新工作表
  • 调用主函数
  • 设置将调用主函数的触发器

基本上是这样的:

function new_campaign(){
    var sheet_name = new_sheet();
    main_function(sheet_name);
    trigger(sheet_name);
}

使用单个工作表没有问题,因为我可以在工作表名称之前设置为全局变量。 问题是我必须创建多个工作表并且所有工作表都必须继续工作。

我创建了新工作表的函数,以便它返回工作表的名称,因此我可以调用 main_function 传递工作表。 不幸的是,触发器并不那么容易,因为我不明白如何通过表格。

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

更新

按照建议,我尝试使用 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);
}

更新 2

我尝试从事件对象中提取触发器 ID 以从 scriptProperties 中获取 sheetName。现在我的main_function 看起来像这样

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

【问题讨论】:

  • 您不能将参数传递给触发函数 - Google 会这样做(作为传递事件对象的一部分)。但是,您可以使用触发器 ID 和 PropertiesService 来存储 ID 和它应该使用的工作表之间的映射。
  • 感谢您的回答! :) 我找到了这个,但我不知道如何在我的情况下使用它。 stackoverflow.com/questions/33360803/… 如何获取触发器 ID 以及如何将其映射到工作表?对不起,但我是新手。代码(也简化)将不胜感激! :)
  • 您从创建的触发器中获取触发器 ID:developers.google.com/apps-script/reference/script/trigger 您通过设置键和值来使用PropertiesService - 值将是您的函数需要的参数,键是触发器ID。在触发函数中,您使用事件对象并在事件对象中查找触发器 ID 的存储值。关于触发器、事件对象和属性服务的 Apps 脚本文档应该包含编写脚本所需的内容 - 一旦您愿意分享,您可以获得更好的帮助。
  • 非常感谢!非常感谢您的帮助!我用更改的代码更新了原始问题。但是仍然存在一个问题。你说要使用事件对象,所以我应该这样做:event.triggerUid 问题是我不知道如何找到事件对象,文档做了一个接收事件对象的示例。 developers.google.com/apps-script/guides/triggers/events如何调用事件对象?谢谢!! :)
  • 您的触发函数(例如main_functiononEdit 等)会自动接收事件对象作为输入参数。您可以在触发函数中将其称为arguments[0],或者,如果您指定了参数名称,则可以使用该参数名称(例如function foo(evobj) { /** code */} 中的evobj)。每次触发器激活时,Google 都会处理创建事件对象。

标签: google-apps-script triggers


【解决方案1】:

解决方案

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    • 2020-12-04
    相关资源
    最近更新 更多