【问题标题】:Google Apps Script admin SDK speedGoogle Apps 脚本管理员 SDK 速度
【发布时间】:2015-08-26 10:30:42
【问题描述】:

我正在创建一个 google 表格,它将学校的给定数据转换为管理员 SDK 上传到 Google Apps。 我知道每秒创建用户限制为 10 个,因此延迟时间为 120 毫秒。 但是,当为处理的工作表中的每一行着色时,速度约为 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
  }

}

【问题讨论】:

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


    【解决方案1】:

    出错是因为每个 google 脚本函数都有 6 分钟的执行时间,您可以通过以下几种方式传达:

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

    如果没有用户插入的批处理,你可以在for()的开头监控函数的执行时间,如果时间接近6分钟(我建议停止在5),保存最后插入的ROW在properties service 中,创建一个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
       }
    }
    

    【讨论】:

    • 刚刚为插图添加了红色油漆,以查看超时发生的位置以及 admindirectory.users 的运行速度。当我在此函数中调用另一个函数时,它会再次有 6 分钟(要保存 5 分钟),还是限制为 6 分钟的“主”脚本的总运行时间(例如,使用 1-249 250- 创建一个单独的函数- 499 等),然后调用该脚本并返回几次?
    • 每个函数运行都有 6 分钟的限制,它会在一段时间后重置,但即使是 GDE 也不知道具体是多少时间,所以我们就安全起见,延迟 6 分钟.我将更新有关如何使新功能再次运行的原始答案,实际上是相同的,但是它会检索要从属性服务启动的行。
    • @RichardvanderPlas 好了,抱歉懒代码,现在没有太多时间。
    猜你喜欢
    • 2021-12-12
    • 1970-01-01
    • 2018-01-22
    • 1970-01-01
    • 2015-05-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    相关资源
    最近更新 更多