问题描述
我刚刚运行了 Apps 脚本教程中的示例代码:
https://developers.google.com/apps-script/reference/groups/group#getGroups()
(我已经注释掉了循环部分以使问题更清楚。)
function listGroupMembers() {
var GROUP_EMAIL = "a-group@in.mydomain";
var group = GroupsApp.getGroupByEmail(GROUP_EMAIL);
Utilities.sleep(10000);
var childGroups = group.getGroups();
console.log("Group " + GROUP_EMAIL + " has " + childGroup.length + " groups:");
/* comment out the loop to make the problem clear.
for (var i = 0; i < childGroups.length; i++) {
var childGroup = childGroups[i];
console.log(childGroup.getEmail());
}
*/
}
但我不断收到以下异常:
Exception: Service invoked too many times in a short time: groups read. Try Utilities.sleep(1000) between calls.
listGroupMembers @ test.gs:6
即使我在过去 24 小时内第一次运行脚本,我也会收到此异常。有什么建议吗?
解决方法
一定是getGroups()
的限制。
我通过更改子组的数量测试了一个组。结果如下。
- 组数:1 到 7:总是成功。
- 组数:8:有时会失败。
- 小组人数:9:有时会成功。
- 组数:10:总是失败。
看起来我们只能在子组数为 7 或更少时使用 getGroups()
。
可能的问题:
- 有很多呼叫您的
getEmail()
。即使函数被执行一次,在超过配额的短时间内,在循环内连续多次调用childGroup.getEmail()
。 - 每天读取的组数限制为 2000/10000(取决于您的帐户)。如果你的超过了这个限制,那么它就达到了配额。如果没有,那么它可能达到了每分钟/小时的配额(还没有找到文档,每分钟/小时是多少)
您可以采取的可能步骤:
- 将您的
sleep
函数放在循环中,这样它就会暂停每个循环,从而减少每分钟/小时的调用次数。看看这是否能缓解问题。
for (var i = 0; i < childGroups.length; i++) {
var childGroup = childGroups[i];
console.log(childGroup.getEmail());
Utilities.sleep(10000);
}
- 如果没有,请检查您的
childGroups
的长度。如果超出限制,请尝试将循环限制为 1950/9950(如果它解决了问题)。如果修复了它,则确认您的函数由于达到配额而失败。
for (var i = 0; i < 1950; i++) { // or 9950,depending on the account
var childGroup = childGroups[i];
console.log(childGroup.getEmail());
Utilities.sleep(10000);
}