Как мне оптимизировать код строки перемещения, сократив количество обращений к серверу? - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть этот код, чтобы пройти через каждую ячейку в столбце A и проверить значение ячейки.Если значение соответствует критерию if, оно перемещает всю строку на правильный лист, а затем заменяет ячейку столбца A на X. Это делает вызов на сервер для каждой ячейки, и мне любопытно, есть ли способ для меняоптимизировать его аналогично тому, что Google задокументировал как Best Practices .Служба кэширования сбивает меня с толку.

Вот копия электронной таблицы, над которой я работаю. У кода есть выполнение меню в Move Row.

function moveToQA() {

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = SpreadsheetApp.getActiveSheet();
  var lastRow = sheet.getLastRow();
  var columnNumberToWatch = 1;
  var targetSheet = ss.getSheetByName("QA ?");

  for( var i = 3; i >= 3; i++ ) {
    var cell = sheet.getRange(i,1);
    var cellValue = cell.getValue();
    if (cellValue == "Captures Sent ?" || cellValue == "QA In Progress ?" || cellValue == "Recapture Completed ?") {
      var targetRange = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
      sheet.getRange(cell.getRow(), 1, 1, sheet.getLastColumn()).moveTo(targetRange);
      cell.setValue("X");
    }
    else if (cellValue != "") {
      continue;
    }
    else if (cellValue == "" || cell == lastRow) {
      break;
    }
  }
}

1 Ответ

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

Пример кода ниже может помочь.Я несколько упростил ваш код, поскольку вопрос был о передовой практике или, как Google называет это «пакетными операциями».Это включает использование getValues() для извлечения всех данных в массив JavaScript за один ввод / вывод.Таким образом, все последующие сравнения и назначения выполняются для объектов в памяти и, следовательно, выполняются быстро.Аналогично, один вызов setValues() используется для записи данных в электронную таблицу за один ввод / вывод.Это гораздо эффективнее, чем чтение содержимого по одной ячейке за раз.

function moveToQA() {

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = SpreadsheetApp.getActiveSheet();
  var lastRow = sheet.getLastRow();
  var targetSheet = ss.getSheetByName("QA");
  var input_range = ss.getRange("A:A"); // Entire column
  var values_in = [], values_out = [];
  // getValues() pulls all the values into a multi-dimensional array in one hit.
  // This allows values to be processed in-memory.
  values_in = input_range.getValues();

  for( var i = 0; i < lastRow; i++ ) {
    var cellValue = values_in[i][0];
    if (cellValue === "X") {
      values_out.push(["Yes"]);
    } else {
      values_out.push(["No"]);;
    }
  }
  // Now write out the new values in one hit.
  var output_range = targetSheet.getRange(1,1,lastRow);
  output_range.setValues(values_out);  
}

Служба кэширования на самом деле не относится к вашей программе.Как сказано в документации, это необходимо для сохранения информации между выполнением сценария.Вариант использования для этого - сценарий GAS, опубликованный в виде веб-приложения, который предоставляет простой веб-сервис поиска на основе содержимого электронной таблицы.Вместо того чтобы читать данные из электронной таблицы при каждом вызове веб-службы, сценарий сначала проверяет, доступны ли данные из службы кэширования.Если это не так, данные электронной таблицы читаются и сохраняются в кэше в следующий раз.

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