javascript - Google 表格 - 同时进行多表格排序和过滤

标签 javascript performance google-apps-script google-sheets

我有一个电子表格模板,供人们存储有关 Pokemon 系列的数据。人们主要有两种方式对他们的口袋妖怪进行排序,按字母顺序和数字顺序,我想同时满足这两种方式,以便与其他人的电子表格进行轻松比较。我还想让人们轻松隐藏目前不在他们收藏中的口袋妖怪。问题是电子表格的大小和工作表的数量。使问题进一步复杂化的是汇总 list 页面,该页面引用了大多数其他页面的数据。更复杂的是,我想在按数字排序时将数据分成七个带有标题行的部分,但在按字母顺序排序时想隐藏标题行。我试过:

1) 使用脚本遍历每个工作表并隐藏第 2 列中未标记为“FT”(贸易)的所有条目。(第 1 列是隐藏索引,便于引用页面使用)。工作表太大,一次隐藏每一行需要很长时间,脚本在完成执行之前超时。如果我一次隐藏所有这些并一次显示我想要的行,则会出现同样的问题

2) 使用过滤器 View ,以便只有 View 的用户可以随意打开和关闭它们。这是次优的,因为用户必须单独切换每个页面,但即使在 list 页面上使用过滤器会导致它中断,因为它引用其他页面上的单元格,因此必然在过滤器之外

我没有尝试通过脚本使用过滤器,但我不知道如何在不破坏 list 和它必须引用的无数页面之间的单元格到单元格的相关性的情况下做到这一点。我确实研究过通过脚本使用过滤器 VIEW,但是 API 还不支持它。

以下是具有开放编辑权限的电子表格副本的链接。有很多要解释的,所以可能需要查看:

https://docs.google.com/spreadsheets/d/1NpsabimIJ4T_ZoeSxaq_dk6ZkIoHey2Dl6U3LGpVTc4/edit?usp=sharing

有没有一种好方法可以隐藏未标记为“FT”且不会超时或破坏我的公式的行?以下是我已经尝试过但耗时过长的脚本。他们每个人都有一个逆转他们影响的双胞胎:

function browseMode() {
  var spreadsheet = SpreadsheetApp.getActive();
  var sheets = spreadsheet.getSheets();

  var sheet = sheets[2];
  var range = sheet.getRange("B3:B392");
  var data = range.getValues();
  sheet.hideRow(range);
  for (var i = 0; i < 390; i++) {
    if (data[i][0] == "FT") sheet.showRows(i+3);
  }
  for (var i = 3; i <= 26; i++) {
    sheet = sheets[i];
    range = sheet.getRange("B5:B76");
    data = range.getValues();
    sheet.hideRow(range);
    for (var j = 0; j < 72; j++) {
      if (data[j][0] == "FT") sheet.showRows(j+5);
    }
    range = sheet.getRange("B78:B128");
    data = range.getValues();
    sheet.hideRow(range);
    for (var j = 0; j < 51; j++) {
      if (data[j][0] == "FT") sheet.showRows(j+78);
    }
    range = sheet.getRange("B130:B192");
    data = range.getValues();
    sheet.hideRow(range);
    for (var j = 0; j < 63; j++) {
      if (data[j][0] == "FT") sheet.showRows(j+130);
    }
    range = sheet.getRange("B194:B226");
    data = range.getValues();
    sheet.hideRow(range);
    for (var j = 0; j < 33; j++) {
      if (data[j][0] == "FT") sheet.showRows(j+194);
    }
    range = sheet.getRange("B228:B300");
    data = range.getValues();
    sheet.hideRow(range);
    for (var j = 0; j < 73; j++) {
      if (data[j][0] == "FT") sheet.showRows(j+228);
    }
    range = sheet.getRange("B302:B339");
    data = range.getValues();
    sheet.hideRow(range);
    for (var j = 0; j < 38; j++) {
      if (data[j][0] == "FT") sheet.showRows(j+302);
    }
    range = sheet.getRange("B341:B380");
    data = range.getValues();
    sheet.hideRow(range);
    for (var j = 0; j < 40; j++) {
      if (data[j][0] == "FT") sheet.showRows(j+341);
    }
  }
  sheet = sheets[27]
  range = sheet.getRange("B3:B104");
  data = range.getValues();
  sheet.hideRow(range)
  for (var i = 0; i < 102; i++) {
    if (data[i][0] == "FT") sheet.showRows(i+3);
  }
}

function sortAlphabetically() {
  var spreadsheet = SpreadsheetApp.getActive();
  var sheets = spreadsheet.getSheets();

  var sheet = sheets[1];
  sheet.hideRows(4);
  sheet.hideRows(77);
  sheet.hideRows(129);
  sheet.hideRows(193);
  sheet.hideRows(227);
  sheet.hideRows(301);
  sheet.hideRows(340);
  sheet.getRange("A4:AB380").sort(2);

  sheets[2].getRange("A3:AG392").sort(3);

  for (var i = 3; i <= 26; i++) {
    sheet = sheets[i];
    sheet.hideRows(4);
    sheet.hideRows(77);
    sheet.hideRows(129);
    sheet.hideRows(193);
    sheet.hideRows(227);
    sheet.hideRows(301);
    sheet.hideRows(340);
    sheet.getRange("A4:AB380").sort(3);
  }

  sheets[27].getRange("A4:AN104").sort(3);
}

感谢您花时间阅读本文,如果这与另一个问题相似,请原谅我,我是新来的,虽然我在论坛上搜索了类似的问题但没有找到任何问题,但我不确定我知道要寻找什么或如何寻找。

最佳答案

首先,为 hideRows() 创建一个映射。使用此映射,运行 hideRows()。这样一来,我认为时间成本和脚本成本就会降低。如果我误解了你的问题,我很抱歉。如果出现错误,请告诉我。

您将如何使用 about sortAlphabetically()

示例脚本:

function browseMode(){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheets = ss.getSheets();
  for (var s=3; s<sheets.length; s++) { 
    var sheet = ss.getSheets()[s];
    try {
      var data = sheet.getRange(1, 2, sheet.getLastRow(), 1).getValues();
    } catch(e) {} // If there are no data in the sheet, do nothing.
    var c1 = 0;
    var hrow = [];
    data.forEach(function(e, i){ // Here, create a map for hiding rows.
      if (e[0]) {
        hrow.push([(c1 + 1), (i - c1)]);
        c1 = i + 1;
      }
    });
    [sheet.hideRows(i[0], i[1]) for each (i in hrow) if(i[1]>0)]; // Here, rows are hidden using the map.
  }
}

关于javascript - Google 表格 - 同时进行多表格排序和过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43245314/

相关文章:

sql - 为什么 Oracle 在同一索引上使用范围扫描和快速全扫描?

javascript - 如何使用 Google Scripts 将 html 表单数据保存到 google 电子表格中?

python - 使用 Python 访问 Google 电子表格以供服务器到服务器使用

javascript - Javascript中匹配正则表达式字符串

javascript - 如何仅当用户存在(通过鼠标移动)时才使用 jQuery 执行 setTimeout()

javascript - 使用 JavaScript 和 Canvas 绘制形状

android - 带有 getView() 的 ListView 由于不断的 GC 而过度缓慢?

c# - 是否有 LINQ 扩展或(一组合理/高效的 LINQ 扩展)确定集合是否至少有 'x' 个元素?

javascript - 如何延迟 javascript 函数的执行直到 JSON 加载完成

javascript - 将包含不同 PDF 的电子邮件发送到不同的电子邮件附件