Как можно уменьшить количество обращений к SpreadsheetApp, чтобы получить все нескрытые строки для списка ранжирования в 10–100 или более раз быстрее? - PullRequest
0 голосов
/ 04 августа 2020

Как можно преобразовать следующий код ({ ссылка }), чтобы он работал аналогично { ссылка } с isRowHiddenByFilter и isRowHiddenByUser? Например, 100 строк могут быть проверены за 1 секунду вместо 30, если все значения были кэшированы один раз раньше.

var sheet = SpreadsheetApp.getActiveSheet();
var lastRow = sheet.getLastRow();
var ranges = [];
for (var i = 0; i < lastRow; i++) {
  if (!sheet.isRowHiddenByFilter(i + 1)) {
    ranges.push("C" + (i + 1));
  }
}
sheet.getRangeList(ranges).setValue('x');

1 Ответ

2 голосов
/ 04 августа 2020
  • Используйте map , чтобы создать новый массив, в котором видимые значения отображаются на «x», а скрытые значения остаются без изменений.

  • Используйте сопоставленный массив, чтобы напрямую setValues на range.

const getVisibleValuesMarkedWithStr_ = (
  shtName,
  rngString,
  sheet = shtName ? SpreadsheetApp.getActive().getSheetByName(shtName) : null,
  range = sheet ? sheet.getRange(rngString) : null,
  stringToMark
) => {
  return range
    .getValues()
    .map((row, rowIdx) =>
      !sheet.isRowHiddenByFilter(rowIdx + 1) &&
      !sheet.isRowHiddenByUser(rowIdx + 1)
        ? row.fill(stringToMark)
        : row
    );
};

function x() {
  const sheet = SpreadsheetApp.getActiveSheet();
  const lastRow = sheet.getLastRow();
  const range = sheet.getRange(`C1:C${lastRow}`);
  range.setValues(getVisibleValuesMarkedWithStr_(null, null, sheet, range, 'x'));
}

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