Скрытие нескольких строк в листе Google на основе значения ячейки - проблема производительности - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть простой набор данных на странице Google, занимающий несколько столбцов (A: N) и около 100 строк вниз.Каждая строка представляет задачу, и задача может находиться в состоянии ОТКРЫТО или ЗАКРЫТО.Значение состояния находится в столбце M.

По умолчанию все задачи имеют статус «ОТКРЫТО», однако, когда пользователь закрывает задачу и выбирает статус «ЗАКРЫТО», я хочу скрыть строку этой задачи.Хотя приведенный ниже код работает должным образом (начальная версия 1), он выглядит медленным и медленным.

В поисках решения я сократил код до версии 2, однако с теми же результатами и, таким образом, думаю, что долженчто-то фундаментальное в том, как работает этот скрипт.

Я также проверил это решение ( Скрипт Google листов, чтобы скрыть строки в пакетном .), но в моем случае он вообще не работалскорость не сильно изменилась.Работая с их примером, я создал версию 3 кода.

Буду признателен за любые улучшения этого кода, пожалуйста.

Спасибо.

PS.В приведенном ниже коде (версия 1) я тестирую второй столбец (B), поэтому getRange (1,2, lastRow, 1)

// Version 1
function hideClosed_ver1() {

  var sheet = SpreadsheetApp.getActive().getSheetByName("Hide"); 
  var lastRow =  sheet.getLastRow();
  var arr = sheet.getRange(1,2,lastRow,1).getValues();

  for(var i = 0; i < arr.length; i++)
  {
    if(arr[i][0]==='Closed')
    {
      sheet.hideRows(i + 1);
    }
  }
}

// Version 2

function hideClosed_ver2() {

  var app = SpreadsheetApp.getActive().getSheetByName('Hide');
  app.getRange('B:B').getValues().forEach(function (r, i) {
    if (r[0] == "Closed")
      app.hideRows(i + 1)
      });   
}

// Version 3

function hideClosed_ver3() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("Hide");
  var currentRange = ss.getRangeByName("Status");
  var rangeStart = currentRange.getRow();
  var values = currentRange.getValues();

  var index = 0, rows = 1;
  var show = !(values[0][1] == "Closed" );

  for (var i = 1, length = values.length; i < length; i++) {
    if (values[i][0] == "Closed" ) {
      if (show) {
        sheet.showRows(rangeStart + index, rows);
        show = false;
        index = i;
        rows = 1;
      } else
        rows++;
    } else {
      if (show)
        rows++;
      else {
        sheet.hideRows(rangeStart + index, rows);
        show = true;
        index = i;
        rows = 1;
      }
    }
  }

  if (show)
    sheet.showRows(rangeStart + index, rows);
  else
    sheet.hideRows(rangeStart + index, rows);
}

1 Ответ

0 голосов
/ 02 февраля 2019
  • Вы хотите скрыть строки, когда в столбце «B» есть значения «Закрыто».
  • Вы хотите работать выше с низкой стоимостью.

Если мое понимание верно, как насчет использования Sheets API?Когда используется метод batchUpdate of Sheets API, несколько строк могут быть скрыты одним вызовом API.

Когда вы используете Sheets API, включите Sheets API в Advanced Google Services и консоли API.О том, как включить API Sheets, можно узнать по здесь .

Модифицированный скрипт:

Скопируйте и вставьте следующий скрипт и запустите.

function sample() {
  var ss = SpreadsheetApp.getActiveSpreadsheet(); // Added
  var sheet = ss.getSheetByName("Hide"); // Modified

  var lastRow =  sheet.getLastRow();
  var rng = sheet.getRange(1,2,lastRow,1);
  var arr = rng.getValues();

  // Following script was added.
  var sheetId = sheet.getSheetId();
  var reqs = arr.reduce(function(ar, e, i) {
    if (e[0] === 'Closed') {
      var req = {"updateDimensionProperties": {
        "properties": {"hiddenByUser": true},
        "range": {"dimension": "ROWS", "startIndex": i, "endIndex": i + 1, "sheetId": sheetId},
        "fields": "hiddenByUser",
      }};
      ar.push(req);
    }
    return ar;
  }, []);
  Sheets.Spreadsheets.batchUpdate({"requests": reqs}, ss.getId());
}

Ссылки:

Еслиэто не тот результат, который вы хотите, пожалуйста, скажите мне.Я хотел бы изменить его.

...