我已经编写了以下功能来抓取Google群组的成员,然后通过它们收集他们的名字和姓氏信息,然后将其以及他们的电子邮件地址写入电子表格行。这适用于小组,但我需要迭代的一些组包含2,000多个成员。当我针对这些组运行该函数时,超出了执行时间,并且脚本失败。
我已经看到了一些关于存储数据和使用时间触发器来提取脚本停止的地方的参考,但到目前为止我还没有能够将一个方法组合起来......还是很绿Google Apps脚本。
任何人都可以提供任何有关我如何优化此功能或利用创造性方法来解决执行时间限制的见解吗?
function listGroupMembersExt() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var inputsheet = ss.getSheetByName("GroupAddress");
var outputsheet = ss.getSheetByName("Members");
var outputactive = outputsheet.getActiveRange();
outputsheet.clear(outputactive);
var j = 1
var grouprange = inputsheet.getRange(1,2);
var groupemail = grouprange.getValue();
var group = GroupsApp.getGroupByEmail(groupemail);
var users = group.getUsers();
for (var i = 0; i < users.length; i++) {
var user = users[i];
s = user.getEmail();
var useracct = AdminDirectory.Users.get(s);
var firstName = useracct.name.givenName;
var lastName = useracct.name.familyName;
Logger.log(lastName);
var cell = outputsheet.getRange(j, 1, 1, 3)
cell.setValues([[s,firstName,lastName]]);
j++;
}
}
答案 0 :(得分:1)
您可以通过将结果存储在数组中来节省大量时间,并在循环之后将此数组写入一个setValues()调用中,而不是分别编写每一行。
您的代码如下所示(对群组服务的调用并不是特别快,因此它不能100%确定它会解决问题,但它应该更好)
function listGroupMembersExt() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var inputsheet = ss.getSheetByName("GroupAddress");
var outputsheet = ss.getSheetByName("Members");
var outputactive = outputsheet.getActiveRange();
outputsheet.clear(outputactive);
var grouprange = inputsheet.getRange(1,2);
var groupemail = grouprange.getValue();
var group = GroupsApp.getGroupByEmail(groupemail);
var users = group.getUsers();
var output = [];
for (var i = 0; i < users.length; i++) {
var user = users[i];
s = user.getEmail();
var useracct = AdminDirectory.Users.get(s);
var firstName = useracct.name.givenName;
var lastName = useracct.name.familyName;
Logger.log(lastName);
output.push([s,firstName,lastName]);
}
outputsheet.getRange(1,1,output.length,output[0].length).setValues(output);
}