我最近创建了一个与电子表格关联的脚本。它是木材供应链模拟游戏得分查看器。基本上,它(使用Urlfetch)获取游戏数据库,以跟踪每个在表格和图表中玩的团队的分数。然后将电子表格共享给每个团队成员,这可以看到游戏的进展。
因此,我使用可安装的onMinute时间触发器来刷新电子表格,并使用数据库中的更新分数。 Everythings工作正常,但最近,我开始收到错误的应用程序脚本通知:
服务调用太多次一天:urlfetch。
然后我意识到当documment未打开时执行可安装的触发器,这完全是逻辑。此外,由于开发模式,我有相当多的spreadheat副本(je comprend pas sa),这解释了我的配额范围。尽管如此,我只需要在文档打开时刷新我的应用程序的分数。
以下是我的问题:
这是我在这里的第一个问题,所以请随意发表有用的评论以便我改进。
谢谢。
答案 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);
}