我正在创建一个google sheet,它将学校的给定数据转换为管理SDK上传到Google Apps。我知道创建用户的限制是每秒10个,因此延迟时间为120ms。但是,当对处理的表中的每一行进行着色时,速度约为500ms -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
}
}
发布于 2015-08-26 19:41:06
它会出错,因为每个google脚本函数都有6分钟的执行时间,你可以通过几种方式来传达这一点:
阅读best practices,其中最重要的事情是成批地做事情,而不是只获得一行并将其变为红色,而是获得几行并进行模拟,1行花费500ms,20行花费505ms。可能还有一种方法可以批量插入用户,但我不使用AdminSDK。
如果没有批处理供用户插入,您可以在for()的请求中监视函数的执行时间,如果时间接近6分钟(我建议在5分钟时停止),保存properties service中插入的最后一行,创建一个将在7分钟内再次运行函数的Progamatic Trigger,然后将这些行涂成红色。它需要很长时间才能完全运行,但会起作用的。
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
}
}https://stackoverflow.com/questions/32224194
复制相似问题