Я видел, что вы не приняли мой предыдущий ответ;Я предполагаю, что это больше не служит вашей цели. Здесь я предоставляю еще одно решение, которое делает то, что вы изначально просили - это обработка только новых строк. Это достигается с помощью Свойства скрипта .
См. Ниже весь код:
var COL_TO_SPLIT = 6;
var DELIMITER = " , ";
var NUM_COLUMNS = 16;
function extract(range, colToSplit, delimiter) {
var resArr = [];
range.forEach(function (r) {
r[colToSplit-1].replace(/(?:\r\n|\r|\n)(\d|\w)/g," , ").split(delimiter)
.forEach(function (s) {
var row = [];
r.forEach(function (c, k) {
row.push( (k === colToSplit-1) ? s.trim() : c);
});
resArr.push(row);
});
});
return resArr;
}
function getCurrentRow() {
var currentRow = PropertiesService.getScriptProperties().getProperty('currentRow');
if (currentRow === null) {
currentRow = 2;
}
return parseInt(currentRow);
}
function updateCurrentRow(newRow) {
PropertiesService.getScriptProperties().setProperty('currentRow', newRow);
}
// Returns the new "currentRow"
function migrateRowsFrom(row) {
var ss = SpreadsheetApp.getActive();
var sourceSheet = ss.getSheetByName('Sheet1');
var destinationSheet = ss.getSheetByName('Sheet2');
var rowsToProcess = sourceSheet.getLastRow() - row + 1;
if (rowsToProcess <= 0) return sourceSheet.getLastRow() + 1;
var rows = sourceSheet.getRange(row, 1, rowsToProcess, NUM_COLUMNS).getDisplayValues();
var extracted = extract(rows, COL_TO_SPLIT, DELIMITER);
destinationSheet.getRange(destinationSheet.getLastRow() + 1, 1, extracted.length, extracted[0].length).setValues(extracted);
return sourceSheet.getLastRow() + 1;
}
function update() {
var lock = LockService.getDocumentLock();
lock.waitLock(10000); // Wait (up to) 10s to acquire the lock
var currentRow = getCurrentRow(); // currentRow is the row from which the script should run. i.e. if the last execution ended at row 2 (included), the value should be left to be 3. 1-indexed.
var newCurrentRow = migrateRowsFrom(currentRow);
updateCurrentRow(newCurrentRow);
lock.releaseLock();
}
Функция, которую вы должны вызвать - update()
. Он извлечет строку, в которой было остановлено последнее выполнение, обработает столько строк, сколько возможно, а затем обновит это значение, чтобы при следующем выполнении было известно, с чего начать.
Обратите внимание, что при этом данные будут перемещены из Sheet1
, обработайте его, а затем вставьте в Sheet2
. Конечно, вы можете изменить эти значения по мере необходимости. Также помните, что вам не следует изменять значения Sheet1
;поскольку, поскольку они уже были обработаны, они больше не будут обрабатываться.