Скрипты приложения Google: назначьте ноль для пустых ячеек - PullRequest
0 голосов
/ 07 февраля 2019

Я новичок в Google Apps Script, пытаюсь установить значения для столбца, основываясь на его текущем значении и флаге.

  1. Если Flag = Y, то получим значение в C1:

    Значение столбца C1 = 23,9895
    Ожидаемое значение = 23

  2. Если флаг = N, то округлить существующее значение в столбце C1:

    столбец C1значение = 23,9895
    Ожидаемое значение = 24

  3. Если флаг имеет значение Y или N, введите 0:

    Значение столбца C1 = пустая ячейка
    ОжидаетсяЗначение = 0

Я уже реализовал приведенный ниже код.Это работало частично.Первые два сценария работают нормально, но третий сценарий завершается неудачей.
Когда я пытаюсь установить ноль, я получаю ошибку #NUM! вместо нуля.Не уверен, как это сделать.

...
do {
  sRange = "Q" + iCt;
  if ((gDecimalInPrice == "Y") && (!isNaN(sheet.getRange(sRange).getValue()))) {
    sheet.getRange(sRange).setValue(Math.abs(parseInt(sheet.getRange(sRange).getValue())));
  } else if ((gDecimalInPrice == "N") && (!isNaN(sheet.getRange(sRange).getValue()))) {
    sheet.getRange(sRange).setValue(Math.abs(Math.round(sheet.getRange(sRange).getValue())));
  } else {
    sheet.getRange(sRange).setValue(sheet.getRange(sRange).getValue());
  }
  iCt = iCt + 1;
} while (iCt <= gRowCt);

1 Ответ

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

Это гораздо быстрее сделать с помощью пакетных операций (и следует официальным рекомендациям ).Эти считывают значения в «2D» массив JavaScript (массив массивов значений), и затем вы можете выполнять всю свою логику в памяти, а не многократно запрашивать данные из медленного интерфейса электронных таблиц .

function foo() {
  const wb = SpreadsheetApp.getActive();
  const sheet = wb.getSheetByName("the sheet name");
  if (!sheet) throw new Error("Sheet with that name is missing");

  const lastRow = sheet.getLastRow();
  const flags = sheet.getRange("A1:A" + lastRow).getValues();
  const valueRange = sheet.getRange("Q1:Q" + lastRow);

  const newValues = valueRange.getValues().map(function (row, i) {
    return row.map(function (value) {
      var flag = flags[i][0];
      if (!flag || (value && isNaN(value))) // No "Y" or "N", or value is non-nullstring non-number, so return value as-is
        return value;
      else if (flag === "Y")
        return value ? Math.floor(parseFloat(value)) : 0;
      else if (flag === "N")
        return value ? Math.round(parseFloat(value)) : 0;
      else // Unknown flag value
        return value;
    });
  });
  // Write all processed values at once
  valueRange.setValues(newValues);
}

Как всегда, вы должны отслеживать макросы и запускаемые функции на наличие ошибок, просматривая журналы Stackdriver (доступные через меню «Просмотр» редактора скриптов).

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