如何强制可安装的时间驱动触发器仅在打开文档时运行

时间:2012-10-25 14:24:34

标签: google-apps-script

我最近创建了一个与电子表格关联的脚本。它是木材供应链模拟游戏得分查看器。基本上,它(使用Urlfetch)获取游戏数据库,以跟踪每个在表格和图表中玩的团队的分数。然后将电子表格共享给每个团队成员,这可以看到游戏的进展。

因此,我使用可安装的onMinute时间触发器来刷新电子表格,并使用数据库中的更新分数。 Everythings工作正常,但最近,我开始收到错误的应用程序脚本通知:

  

服务调用太多次一天:urlfetch。

然后我意识到当documment未打开时执行可安装的触发器,这完全是逻辑。此外,由于开发模式,我有相当多的spreadheat副本(je comprend pas sa),这解释了我的配额范围。尽管如此,我只需要在文档打开时刷新我的应用程序的分数。

以下是我的问题:

  1. 可安装onMinute时间是否触发了正确的方法?
  2. 有没有办法只在文档打开时才启动触发器?
  3. 这是我在这里的第一个问题,所以请随意发表有用的评论以便我改进。

    谢谢。

3 个答案:

答案 0 :(得分:0)

除非您可以在游戏方面编写代码以将更改推送到电子表格,这会在双方使用更少的资源,否则时间驱动的触发器似乎是唯一的“自动”方式。

我说自动,因为您可以将其更改为“按需”。我的意思是,您可以在电子表格或图像中添加一个菜单(您可以指定在点击时运行脚本),这将更新分数。

这也可以是半动态的,例如,当用户点击按钮时,您会在接下来的30分钟左右开始自动更新分数(以编程方式设置时间驱动的触发器)。

问你的问题n.2:不,这是不可能的。好吧,只有一半。因为您可以检测电子表格何时打开(通过设置开启触发器),但您无法知道它何时关闭。

答案 1 :(得分:0)

如何使用onOpen事件以编程方式创建以下内容:

  • 每分钟更新电子表格的新触发器
  • 检查

    的新的每小时触发器
    if {a user property is set} 
    then deletes all the triggers 
    else set the user property
    
  • 一个onEdit触发器,用于取消设置前面提到的用户属性

因此,如果用户未编辑电子表格一小时,则所有触发器都会停止
这有点令人费解,但没有onClose事件,令人费解的是你能想到的最好的。

答案 2 :(得分:0)

这是我想象的一段代码,可以做你想要的或者至少接近......

我尝试了on a testsheet(与请求的授权共享)并且它按预期工作,即只有在某人正在编辑电子表格时才会执行计时器触发功能,否则它将返回。 让我们说这是一个提案,你会告诉我它是否符合你的要求; - )

function onTimer() { // this function has a timer trigger set to 1 minute
  var ss = SpreadsheetApp.openById('0AnqSFd3iikE3dG90MzRwX0FQUnoxTWZjcmtLSlVuT3c')
  var sh = ss.getSheets()[0]
  var logsheet = ss.getSheets()[1]
  var formerUser = ScriptProperties.getProperty('lastUser')
   if(formerUser=='nobody'){return}
     ss.toast('The sheet is being edited by '+Session.getActiveUser());
     ScriptProperties.setProperties({'lastUser': 'nobody'}, true); 
     logsheet.getRange(logsheet.getLastRow()+1, 1).setValue('onTimer function was running on '+
     Utilities.formatDate(new Date(),'GMT+2','HH:mm'))
}

function onUserPresent(){ // this one has an onEdit installable trigger
 ScriptProperties.setProperties({'lastUser': 'someone'}, true);   
}