我正在创建一个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
}
}
答案 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
}
}