谷歌表 - 同时多页分类和过滤

时间:2017-04-06 03:43:36

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

我有一个电子表格模板供人们存储有关Pokemon集合的数据。人们按照字母顺序和数字顺序排列他们的口袋妖怪有两种主要方式,我希望能够兼顾两者以便与其他人的电子表格进行比较。我还想让人们轻松隐藏当前不在他们收藏中的神奇宝贝。问题是电子表格的大小和页数。进一步复杂化的问题是总结清单页面,它引用了大多数其他页面的数据。更复杂的问题是,我想在数字排序时将数据分成带有标题行的七个部分,但是在按字母顺序排序时要隐藏标题行。我试过了:

1)使用脚本迭代每个工作表并隐藏所有未标记的条目" FT" (对于贸易)在第2列中。(第1列是隐藏索引,便于参考页面使用)。工作表非常大,每次隐藏每一行需要很长时间,脚本会在完成执行之前超时。如果我一次隐藏所有这些并且一次显示我想要的行

,就会出现同样的问题

2)使用过滤器视图,以便仅查看用户可以在闲暇时打开和关闭它们。这不是最理想的,因为用户必须单独切换每个页面,但即使在清单页面上使用过滤器工作也会导致它中断,因为它引用其他页面上的单元格,因此必然在过滤器之外

我没有尝试通过脚本使用过滤器,但我不知道如何做到这一点,而不会破坏清单和必须引用的无数页面之间的单元格相关性。我确实试过通过脚本使用过滤器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);
}

感谢您抽出时间阅读本文,如果这与其他问题类似,请原谅我,我是新来的,虽然我在论坛上搜索了类似的问题但没找到,我和#39;我不确定我知道该寻找什么或如何看待。

1 个答案:

答案 0 :(得分:1)

首先,为hideRows()创建地图。使用此地图,即可运行hideRows()。通过这个,我认为时间和脚本的成本变低了。如果我误解了你的问题,我很抱歉。如果发生错误,请告诉我。

您将如何使用约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.
  }
}