以编程方式为独立的webapp添加可安装的时间驱动触发器

时间:2016-05-03 19:45:48

标签: google-apps-script

我希望我的独立网络应用程序脚本每天14:00到15:00 GMT +4:30(亚洲/德黑兰)运行。它应该打开一个电子表格并检查某个单元格。

到目前为止,我有以下内容:

function addTrigger() {
  var ssid = "My SpreadSheet ID";
  var ss = SpreadsheetApp.openById(ssid);
  var everyDay = ScriptApp.newTrigger("checkExitTime")

在此阶段,forSpreadSheet(String key)和timeBased()都显示在可用方法列表中。但当我链接一个,另一个变得不可用。因此,如果我使用forSpreadSheet方法,timeBased()方法就会消失,显示的唯一方法是create()onChange(),onEdit(),onOpen()和onFormSubmit()。我怎么能同时拥有这两个?

我希望有类似的东西:

var everyDay = ScriptApp.newTrigger("checkExitTime")
            .timeBased().everyDays(1).atHour(14).inTimezone("Asia/Tehran")
            .forSpreadSheet(ss)
            .create()

1 个答案:

答案 0 :(得分:0)

ScriptApp.newTrigger返回一个TriggerBuilder类,它进一步将触发器分类为不同类型的触发器。因此,当您调用ScriptApp.newTrigger("yourFn").timeBaesd()时,将返回一个ClockTriggerBuilder类,其方法将返回相同的ClockTriggerBuilder类进行方法链接,但您将保留在该类中。

要访问其他类型的触发器,在您的情况下.forSpreadSheet(ss)将返回SpreadsheetTriggerBuilder类,其构建器方法将返回相同的方法链类。

在您的代码中:

var everyDay = ScriptApp.newTrigger("checkExitTime")
        .timeBased().everyDays(1).atHour(14).inTimezone("Asia/Tehran")
        .forSpreadSheet(ss)
        .create();

使用.forSpreadSheet是不必要的,没有任何意义,因为你不能链接这两个方法,因为它们在返回的对象中不可用。

我认为你想要做的是在基于时间的触发器运行时操纵电子表格;所以你应该创建一个时间驱动的触发器,并在其处理函数中执行任务:

var everyDay = ScriptApp.newTrigger("checkExitTime")
        .timeBased().everyDays(1).atHour(14).inTimezone("Asia/Tehran")
        .create();

//// Handler function of time driven trigger
function checkExitTime(e){
    var ssid = "My SpreadSheet ID";
    var ss = SpreadsheetApp.openById(ssid);
    //// do your task
}

但是,如果您还需要onOpen()onEdit()等电子表格触发器,则必须像"this"一样单独启动它们。

 // Creates an edit trigger for a spreadsheet identified by ID.
 var ssid = "My SpreadSheet ID";
 ScriptApp.newTrigger('myFunction')
     .forSpreadsheet(ssid)
     .onEdit()
     .create();

 // your onEdit event handler
 function myFunction(event){
      // your code..
 }

将在您的电子表格中发生编辑事件时执行myFunction