【问题标题】:Google Apps Script Execution Time Optimization [duplicate]Google Apps 脚本执行时间优化 [重复]
【发布时间】:2014-10-15 10:56:36
【问题描述】:

我编写了以下函数来获取 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++;
  }
}

【问题讨论】:

    标签: google-apps-script google-apps


    【解决方案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);
    }
    

    【讨论】:

      猜你喜欢
      • 2018-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多