簡體   English   中英

根據單元格值在Google工作表中隱藏多行-性能問題

[英]Hiding multiple rows in google sheet based on cell value - perfromance issue

我在Google工作表中有一個簡單的數據集,占用了幾個列(A:N),向下大約100行。 每行代表一個任務,一個任務可能處於“打開”或“關閉”狀態。 狀態值在M列中。

默認情況下,所有任務的狀態均為“ OPEN”,但是,當用戶關閉任務並選擇狀態為“ CLOSED”時,我想隱藏該任務的行。 盡管下面的代碼可以按需工作(初始版本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);
}
  • 當列“ B”中的值為“已關閉”時,您想隱藏行。
  • 您想以低成本運行在上面。

如果我的理解正確,那么如何使用Sheets API? 使用Sheets API的batchUpdate方法時,一個API調用可以隱藏多行。

使用表格API時,請在高級Google服務和API控制台中啟用表格API。 您可以在此處了解有關如何啟用Sheets API的信息

修改后的腳本:

請復制並粘貼以下腳本並運行。

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());
}

參考文獻:

如果這不是您想要的結果,請告訴我。 我想修改它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM