1

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

因此,我使用了一个可安装的 onMinute 时间触发器来使用来自数据库的更新分数来刷新电子表格。一切都在工作,但最近,我开始收到 app-script-notifications of failure with error :

一天服务调用次数过多:urlfetch。

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

这是我的问题:

  1. 可安装的 onMinute 时间触发器是正确的方法吗?
  2. 有没有办法让触发器仅在文档打开时运行?

这是我在这里的第一个问题,所以请随时发表有用的评论,让我改进。

谢谢你。

4

3 回答 3

0

这是我想的一段代码,它可能会做你想做的事,或者至少可以接近......

在测试表上尝试了它(与请求授权共享),它按预期工作,即定时器触发函数仅在有人正在编辑电子表格时执行,否则它会返回。假设这是一个提案,你会告诉我它是否符合你的要求;-)

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);   
}
于 2012-10-27T19:33:28.250 回答
0

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

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

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

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

于 2012-10-25T18:58:23.677 回答
0

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

  • 每分钟更新电子表格的新触发器
  • 一个新的每小时触发器,用于检查

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

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

于 2012-10-26T08:01:12.180 回答