Обновление диапазона ячеек в листах Google при изменении одной ячейки с помощью - PullRequest
1 голос
/ 22 сентября 2019

Используя JavaScript, я хочу обновить диапазон ячеек в Google Sheets.Код не выдает никакой ошибки, но также не работает.

function OnEditDate(e){    
    var app = SpreadsheetApp;  
    var ss = app.getActiveSpreadsheet();  
    var act = ss.getActiveSheet();
    var i;
    var j;

    for(i = 2; i = 30; i++){
        for(j = 5; j = 20; j++){
            var newVal = act.getRange(i+1,j).getValue();
            act.getRange(i,j).setValue(newVal);

        }
    }
}

Это должно обновить все ячейки в диапазоне E2:U30, перемещая содержимое всех ячеек в левую одну ячейку.

1 Ответ

1 голос
/ 22 сентября 2019

Давайте начнем с нескольких наблюдений ...

Ваши циклы 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(), что позволяет вам получить и установить всю сетку ячеек за одну операцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...