2015-08-26 2 views
0

Я создаю листок Google, который переводит данные из школ на загрузку SDK администратора в Google Apps. Я знаю, что пользовательский лимит создания составляет 10 в секунду, следовательно, время задержки 120 мс. , но при раскраске каждой строки в листах, которые обрабатываются, скорость составляет около 500 мс - 2 секунды на запись. Который заставляет сценарий останавливаться на максимальном времени выполнения, потому что добавлено более 600 пользователей. Где все идет не так?Google Apps Script admin SDK speed

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

Это идет не так, потому что каждая функция сценария Google имеет время 6minutes выполнения, вы можете передать это несколькими способами:

Прочитать best practices, самое главное в нужно делать вещи партиями, вместо того, чтобы получать только ROW и превращать ее в RED, получать несколько ROW и делать симе, 1 ROW стоит 500 мс, 20 ROW будут стоить 505 мс. Вероятно, есть возможность для пакетной вставки и пользователей, но я не использую AdminSDK.

Если в пользовательской вставке нет партии, вы можете отслеживать время выполнения функции в начале for(), если время приближается к 6minutes (я рекомендую остановиться на 5), сохраните последний ROW, вставленный в properties service, создайте Progamatic Trigger, который снова запустит функцию в 7 минут, затем нарисуйте ROWs красным цветом. Это займет много времени, чтобы работать полностью, но будет работать.

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 
    } 
} 
+0

красная краска была просто добавлена ​​для иллюстрации, чтобы увидеть, где произошло время ожидания и как быстро запускались admindirectory.users. , когда я вызываю другую функцию в этой функции, у нее будет еще 6 минут (5 для сохранения), или это общая продолжительность сценария «мастер», ограниченная 6 минутами (например, сделать отдельную функцию с 1-249 250 -499 и т. Д.) И просто вызывать этот скрипт с возвратом пару раз? –

+0

Каждый запуск функции имеет ограничение в 6 минут, после этого он сбрасывается, но даже GDE не знают точно, сколько времени у него есть, поэтому мы будем играть в безопасном режиме и двигаться с задержкой 6 минут. Я обновлю исходный ответ о том, как запустить новый funciton снова, это на самом деле то же самое, но он возвращает строку, начинающуюся с сервиса свойств. – Kriggs

+0

@RichardvanderPlas Там, извините за ленивый код, сейчас у вас мало времени. – Kriggs

Смежные вопросы