Проверьте, работает ли этот код для вас:
function done() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = ss.getSheetByName('Main Sheet'); // ss.getActiveSheet(); <= better call by name
var numColumns = s.getLastColumn();
var values = s.getDataRange().getValues(); // values keeps an array from the whole Sheet
var doneSheet = ss.getSheetByName("Done Sheet");
var ctrlSheet = ss.getSheetByName("Control Sheet");
var rows_to_delete = []; // will receive the indexes to delete
var doneSheetInputs = []; // will receive data to be inputed on doneSheet
var ctrlSheetInputs = []; // will receive data to be inputed on ctrlSheet
for(var i = 0; i < values.length; i++) {
var cP = values[i][15]; //s.getRange(i, 13).getValue();
var cM = values[i][12]; //s.getRange(i, 10).getValue();
if (cP == "Done" && cM == "Update") {
doneSheetInputs.push(values[i]);
rows_to_delete.push(i + 1); // +1 because of difference in Array versus Google Sheets index
Logger.log('Moving row ' + (i + 1) + ' to DONE');
}
else if (cP == "Done") {
ctrlSheetInputs.push(values[i]);
rows_to_delete.push(i + 1);
Logger.log('Moving row ' + (i + 1) + ' to CONTROL');
}
}
Logger.log('doneSheetInputs has ' + doneSheetInputs.length + ' entries');
if (doneSheetInputs.length > 0) {
doneSheet.getRange(doneSheet.getLastRow() + 1, 1, doneSheetInputs.length, doneSheetInputs[0].length).setValues(doneSheetInputs);
}
Logger.log('ctrlSheetInputs has ' + ctrlSheetInputs.length + ' entries');
if (ctrlSheetInputs.length > 0) {
ctrlSheet.getRange(ctrlSheet.getLastRow() + 1, 1, ctrlSheetInputs.length, ctrlSheetInputs[0].length).setValues(ctrlSheetInputs);
}
Logger.log('rows_to_delete has ' + rows_to_delete.length + ' entries');
var rev = rows_to_delete.reverse(); // delete from bottom to top
for (var i = 0; i < rev.length; i++) {
s.deleteRow(rev[i]);
}
}
Не рекомендуется вызывать getRange().getValues()
столько раз, особенно внутри длинного оператора for
, как описано в Скрипт Google Apps Best Practices. Я всегда пытаюсь вызвать getValues
перед выполнением любых итераций и возвращать значения в конце кода в пакетной операции.
РЕДАКТИРОВАТЬ: обнаружил, что индексы для столбцов P и M были неправильными - не проверить это. Вот рабочий пример: https://docs.google.com/spreadsheets/d/1n68KqmI7HongEzJ_MSwmeQUqlAExjvCu2epEjEBZrlg/edit#gid = 0 (при необходимости отправьте мне запрос на доступ).