1

Я создал лист Google для отправки грузовиков для доставки нашей компании. У нас есть лист под названием «Незапланированные задания», в котором перечислены все задания, которые нужно выполнить. При планировании маршрута на день они перемещаются на листы, названные в честь каждого водителя. Когда водитель выполнит свои поставки, он отметит каждую выполненную работу. Каждые 5 минут запускается сценарий, который будет перемещать задания, помеченные как завершенные, на лист под названием «Завершенные задания» и вставлять имя драйвера (столбец O), а также отметку даты и времени (столбец N), когда задание завершено.Вставка данных в массив foreach перед переходом на другой лист Google

Сценарий, который мы сейчас довольно медленный, поэтому я пытаюсь сделать это, используя массив, но не имеющий никакого успеха. Я очень новичок в этом, поэтому я был бы признателен, если кто-то достаточно, чтобы ответить, может объяснить, что делает их код.

код Я пытаюсь использовать: комментарий

function reschedule() { 

    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    ss.setActiveSheet(ss.getSheetByName('Driver')); 
    var sheet = ss.getSheetByName('Driver');var clearrange = sheet.getRange(3, 1, sheet.getLastRow() - 1, sheet.getLastColumn()); 
    var targetSheet = ss.getSheetByName('Completed'); 
    var val = sheet.getRange(3, 1, sheet.getLastRow() - 1, sheet.getLastColumn()) 
     .getValues(); 


    var arr = [], 
     rowsToWriteBack = []; 
     rowsToWriteBack.push(); 


    val.forEach(function (r, i) { 
     r[3] == 'Completed' ? arr.push(r) + Utilities.formatDate(new Date(), "GMT-4", "MM-dd-yyyy EEE hh:mm a") : rowsToWriteBack.push(r) 
    }); 


    if (arr.length > 0) { 
     targetSheet.getRange(targetSheet.getLastRow() + 1, 1, arr.length, arr[0].length) 
     .setValues(arr); 

     clearrange.clear({contentsOnly:true}); 
     sheet.getRange(3, 1, rowsToWriteBack.length, rowsToWriteBack[0].length) 
     .setValues(rowsToWriteBack); 
    } 

} 
+0

arr.push (r) вернет индекс r в обр. так что arr.push (r) + somedate странно –

ответ

0

Jonas W кажется прямо на. Вы пытаетесь добавить столбец временного штампа в свою строку, если задание завершено? Если это так, возможно, изменить эти строки:

val.forEach(function (r, i) { 
    r[3] == 'Completed' ? arr.push(r) + Utilities.formatDate(new Date(), "GMT-4", "MM-dd-yyyy EEE hh:mm a") : rowsToWriteBack.push(r) 
}); 

к чему-то вроде этого:

val.forEach(function (r, i) { 
    if r[3] === 'Completed' { 
     r[4] = Utilities.formatDate(new Date(), "GMT-4", "MM-dd-yyyy EEE hh:mm a"); 
     arr.push(r) 
    } else { 
     rowsToWriteBack.push(r) 
    } 
}); 
0

Это работает отлично. Окончательный код, в случае, если кто-то заинтересован, выглядит так ...

function rescheduleDriversJobs() { 

//Get an exlusive lock on the sheet 

var lock = LockService.getScriptLock(); 
try { 
    lock.waitLock(2000); 
} catch (e) { 

//Displayes a browser message if unable to get an exclusive lock on the sheet 
    Browser.msgBox('Another script is running. Please try again later'); 

//Releases the lock if unable to get an exclusive lock on the sheet 
    lock.releaseLock(); 

//Cancels the Script 
    return; 
} 

    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    ss.setActiveSheet(ss.getSheetByName('Sheet Name')); 
    var sheet = ss.getSheetByName('Sheet Name'); 
    var clearrange = sheet.getRange(3, 1, sheet.getLastRow() - 1, sheet.getLastColumn()); 
    var targetSheet = ss.getSheetByName('Completed Jobs'); 
    var val = sheet.getRange(3, 1, sheet.getLastRow() - 1, sheet.getLastColumn()) 
     .getValues(); 

//Builds the arrays  
    var arr = [], 
     rowsToWriteBack = []; 
     rowsToWriteBack.push(); 

//populates the arrays  

    val.forEach(function (r, i) { 
    if (r[3] === 'Completed') { 

    //Adds Date and Time stamp to Column N of the "Completed Jobs" sheet 
     r[13] = Utilities.formatDate(new Date(), "GMT-4", "MM-dd-yyyy EEE hh:mm a"); 

//Adds the name of the driver completing the job to Column O of the "Completed Jobs" sheet 
     r[14]="Driver Name"; 
     arr.push(r) 
    } else { 
     rowsToWriteBack.push(r) 
    } 
}); 


    if (arr.length > 0) { 

    //Inserts empty rows after the header row of the "Completed Jobs" sheet to populate with array data 
    targetSheet.insertRowsBefore(2, arr.length) 

    //Selects the range on the target sheet to be populated with data from the array (The empty rows we just created with the above line) 
    targetSheet.getRange(2, 1, arr.length, arr[0].length) 

    //Send the data to the target sheet 
    .setValues(arr); 

//Clears that data that has been moved 
    clearrange.clear({contentsOnly:true}); 
     sheet.getRange(3, 1, rowsToWriteBack.length, rowsToWriteBack[0].length) 
     .setValues(rowsToWriteBack); 
    } 

//Releases the lock so other scripts can run  
lock.releaseLock(); 

}