超过Google Apps脚本中的最长执行时间,以便从电子邮件域中检索用户名和电子邮件地址

时间:2017-04-13 03:12:34

标签: google-apps-script google-sheets spreadsheet

我有这个代码。我设置了一个时间触发器来检索每个员工的姓名,电子邮件域中的电子邮件地址,为其分配主键并将其写在电子表格中。我为出勤系统做了那个。但是当执行时间超过5分钟时,我无法从电子邮件域中检索整个员工姓名和电子邮件地址。 我能做什么? 请帮忙。  谢谢!

function primarykeyrecord(){
 var lastval;
 var sheet=getData();
 var data = sheet.getDataRange().getValues();
 lastval=data[data.length-1][0]; 
  if(lastval !== "primarykeyvalue"){
    lastval=lastval+1;
   }
  else {
     lastval=1;
  }
 // Logger.log( lastval);
  return lastval;
}

// list all the user from the  domain
function listAllUsers() {
  var pageToken, page;
  var today =methodtimenow();
  do {
    page = AdminDirectory.Users.list({
      domain: '',
      //orderBy: 'givenName',
      maxResults: 300,
      pageToken: pageToken
    });
     users = page.users;
    userslength=users.length; // the number of user from the email domain 
    if (users) {
      for (var i = 0; i < users.length; i++) {
        var user = users[i];
        var sheet = getData();
        var lastval=primarykeyrecord();

        var range = sheet.getRange(sheet.getLastRow()+1, 1, 1, 4);
        var values = [[lastval,today,user.primaryEmail,user.name.fullName ]];
        range.setValues(values);
      }
    } else {
      Logger.log('No users found.');
    }
    pageToken = page.nextPageToken;
  } while (pageToken);

//Logger.log(values);
}

1 个答案:

答案 0 :(得分:2)

您的脚本超时的原因是,您递归调用setValues()和getValue()。两者都是资源密集型过程,应尽可能少量使用,改为使用批量更新。

以下代码获取values数组中的所有用户数据,并在最后一次添加数组。

 function listAllUsers() {
          var pageToken, page;
          var today =methodtimenow();
          var lastval=primarykeyrecord(); //Access the last value once and then keep adding one
          var values = []   //Create empty array
  do {
        page = AdminDirectory.Users.list({
          domain: '',
          //orderBy: 'givenName',
          maxResults: 300,
          pageToken: pageToken
        });
         users = page.users;
        userslength=users.length; // the number of user from the email domain 
        if (users) {
          // And all the user data to values array
          for (var i = 0; i < users.length; i++) {
            var user = users[i];
            var temp = [lastval,today,user.primaryEmail,user.name.fullName ];
            values.push(temp)
            lastval++;                //Increase key value by one
          }
        } else {
          Logger.log('No users found.');
        }
        pageToken = page.nextPageToken;
      } while (pageToken);
    var sheet = getData();
    var lastRow = sheet.getLastRow()
    var range = sheet.getRange(lastRow+1, 1, values.length, 4);
    range.setValues(values);
    //Logger.log(values);
    }

希望有所帮助!