Google Apps脚本管理SDK速度

时间:2015-08-26 10:30:43

标签: google-apps-script google-admin-sdk

我正在创建一个Google工作表,将学校提供的数据转换为管理员SDK上传到Google Apps。 我知道创建用户限制为每秒10次,因此延迟时间为120ms。 但是,当对要处理的纸张中的每一行着色时,速度大约为500毫秒 - 每个条目2秒。 这导致脚本在最长执行时停止,因为要添加的用户超过600个。 它出了什么问题?

function UploadUsers() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sh = ss.getSheetByName("Upload");
ss.setActiveSheet(sh); 

var column = sh.getRange('A1:I5000');

  var values = column.getValues(); // get all data in one call

  
  var uploadRows = 0;
  while ( values[uploadRows][0] != "" ) {
    uploadRows++;
  }

  var i=0
  var uiACU = SpreadsheetApp.getUi();
  var ACUsersMessage0= "Upload Users";
  var ACUsersMessage1= "Indien u op OK drukt worden er : "+ uploadRows + " Users aangemaakt! " 
                       
    var result = uiACU.alert( 
   ACUsersMessage0,
   ACUsersMessage1,
         uiACU.ButtonSet.OK_CANCEL);
 
  if (result == uiACU.Button.OK) { 
 for (i=0; i<uploadRows;i++){

var uniqueId=[i][0];
var mailAdress=values[i][3];
var voorNaam=values[i][1];
var achterNaam=values[i][2];
var Ou=values[i][8];
var Pass=values[i][4];



   Utilities.sleep(12);
  
 AdminDirectory.Users.insert ({
   "kind": "admin#directory#user",
   "password" : Pass,
   "primaryEmail": mailAdress,
   "orgUnitPath": Ou,
   "changePasswordAtNextLogin": "TRUE",
   "name": {
      "givenName": voorNaam,
      "familyName": achterNaam,
   },
    "externalIds": [
      {
    "value": uniqueId,
    "type": "account",
    "customType": "gappsUniqueId"
      }
  ]
   })   
   
 ss.getRange("D"+ (i+1)).setBackground("red")  

}    
 
    
  } else {
     //Full Stop
  }

}

1 个答案:

答案 0 :(得分:0)

它出错了,因为每个google脚本函数都有6分钟的执行时间,你可以通过以下两种方式传达这一点:

阅读best practices,最重要的是分批做事,而不是只获得ROW并将其变为RED,获得几个ROW并执行sime,1 ROW花费您500ms,20行将花费505毫秒。批量插入用户可能还有一种方法,但我不使用AdminSDK。

如果用户插入没有批处理,您可以在for()的开始时监视该功能的执行时间,如果时间接近6分钟(我建议停在5),保存最后一个在properties service中插入ROW,创建一个Progamatic Trigger,将在7分钟内再次运行该函数,然后将ROW画成红色。完全运行需要很长时间,但是会有效。

function insertUsers(){
   var timeStart = new Date().getTime();
   var rowStart = PropertiesService.getScriptProperties().getProperty('lastRow') || 0;

   for( from rowStart to endOfSheet ){
      if( (new Date().getTime()) - timeStart > (5 * 60 * 1000) ){
         PropertiesService.getScriptProperties().setProperty('lastRow', currentRow);

      createTriggerToRun-insertUsers-in6Minutes;

      return 1;
     }

   // code to insert users here
   }
}