Есть ли способ сделать этот цикл более эффективным? - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть Google Sheet, где я собираю инвентарь.Недавно я заметил кучу математических ошибок, поэтому я решил сократить интеллектуальное сложение и создать цикл Apps Script, который добавляет два столбца и сбрасывает первый столбец для меня.Но поскольку я использую getValue в основном в каждом цикле, это очень трудоемкий процесс.

Я пытался искать способы записи в массивы и т. Д., Но это мой первый набег в Google Sheets, а неExcel.

Вот и вся функция:

function Update() {

  var ss = SpreadsheetApp.getActive();

  var sheet = ss.getSheetByName('Name');


 for (var x = 2; x < 905; x++) {


  var range1 = sheet.getRange([x],7);

  var num1 = range1.getValue();

  var range2 = sheet.getRange([x],8)

  var num2 = range2.getValue();


  range2.setValue(num1 + num2)

  range1.setValue ('0')

  }
}

Работает правильно, но очень медленно, и я буду признателен за любые советы о том, как сделать это более эффективным.

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Как показывает ответ Купера, вы хотите использовать пакетные Range методы getValues и setValues для манипулирования массивом JavaScript, согласно «рекомендациям»

Улучшениеиспользовать методы класса Array, чтобы уменьшить доступ к вложенным свойствам, например map (вернуть массив на основе исходного массива) или forEach (сделать что-то длякаждый элемент в исходном массиве).Эти методы класса предоставляют вашей функции обратного вызова текущий элемент, индекс и исходный массив в качестве аргументов функции, если они необходимы.

Когда требуется поведение при коротком замыкании (остановите обработку, как только будет выполнено какое-либо условие),традиционный основанный на индексах цикл for по-прежнему является королем.

function processArray() {
  const wb = SpreadsheetApp.getActive();
  const sheet = wb.getSheetByName('Name');

  const startRow = 2, endRow = 905;
  const startCol = 7, numCols = 2;
  const rg = sheet.getRange(startRow, startCol, endRow - startRow + 1, numCols);

  // Construct a new array based on the source array.
  const result = rg.getValues().map(function (row) {
    return [ 0, row[0] + row[1] ];
  });
  // (In this case we haven't changed the dimensions, so we could re-use `rg` .)
  if (result.length) {
    // sheet.getRange(someRow, someCol, result.length, result[0].length).setValues(result);
    rg.setValues(result);
  }
}

(Обратите внимание, что в настоящее время Apps Script не поддерживает использование в области блока const, только переназначениезащита)

0 голосов
/ 05 февраля 2019

Попробуйте это:

function Update() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('Name');
  var rg=sh.getRange(2,7,904,2);
  var vA=rg.getValues();
  for(var i=0;i<vA.length;i++){
    vA[i][1]=vA[i][0]+vA[i][1];
    vA[i][0]=0;
  }
  rg.setValues(vA);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...