Давайте начнем с нескольких наблюдений ...
Ваши циклы for не указаны правильно.
Синтаксис цикла for равен for ([initialization]; [condition]; [final-expression])
.
Ваши операторы условия i = 30
и j = 20
, которые являются операторами присваивания.Таким образом, в дополнение к заглушению предполагаемой логики, они также всегда оцениваются в true
.Вместо этого вы должны использовать оператор сравнения, например, i >= 30
и j >= 30
.
Кроме того, вы не должны вызывать методы API, такие как getRange()
, getValue()
, setValue()
внутри для петель .Эти операции выполняются медленно и приведут к тому, что выполнение скрипта займет много времени.
Вы должны использовать пакетные операции , чтобы получить / установить весь диапазон ячеек, которые вы хотите обновить вкак можно меньше API-вызовов.
В вашем случае, поскольку вы не обрабатываете данные, вам не нужно на самом деле просматривать данные .
Вотреализация, которая выполняет движение, которое вы описали:
function moveCells() {
var sheet = SpreadsheetApp.getActiveSheet();
var startingColumn = 5; // Column E
var startingRow = 2; // Row 2
var numColumns = 17; // to Column U
var numRows = 29; // to Row 30
// Get the source range which contains the data.
var sourceRange = sheet.getRange(startingRow, startingColumn, numRows, numColumns);
// Get the target range (i.e. same size as sourceRange, but starting one column
// to the left).
var targetRange = sheet.getRange(startingRow, startingColumn - 1, numRows, numColumns);
// Get all of the values from sourceRange into a 2-dimensional array.
var values = sourceRange.getValues();
// Clear all of the cells in sourceRange.
sourceRange.clearContent();
// Set the cell values targetRange, using the values extracted from sourceRange.
targetRange.setValues(values);
}
Обратите внимание, что я использую 4 версию аргумента getRange()
, которая позволяет вам работать с сеткой ячеек.
Точно так же я использую getValues()
и setValues()
, что позволяет вам получить и установить всю сетку ячеек за одну операцию.