如何在使用/ Google Apps脚本迭代Google电子表格时跳过隐藏的行

时间:2011-07-22 17:29:26

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

我有一个包含许多隐藏行的Google电子表格,我想在迭代电子表格中的行列表时跳过它们。

这主要是一个效率问题,因为我正在处理超过一半的行被隐藏而且无需检查。

任何帮助都将不胜感激。

5 个答案:

答案 0 :(得分:4)

在Apps脚本中没有直接的方法可以做到这一点,但是有一个feature request打开以提供获取行的显示/隐藏状态的方法,如果你想要加星标。

答案 1 :(得分:3)

问题跟踪器认为请求since Aug 3, 2010具有中等优先级,只有“分类”状态。超过3年,没有GAS团队解决方案的迹象。

我的解决方法是使用一个特殊的前导字符来表示行/列的可见性状态,它是顶部标题行/列的单元格中的前导反引号(`)。 如果在列标题中使用了合并的单元格,那么一个空的顶行应专用仅用于该功能,直到Google工程师改进API。 如果第一行/列单元格中有公式,则同样适用。 专用行/列本身可以隐藏。

开始使用此功能后,每个show / hide column / row命令都应该从自定义菜单执行,否则在以编程方式迭代范围时会出现错误,因为缺少/过多的反引号。

e.g。隐藏所选单元格的行,调用以下函数

function hideSelectedRows() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var range = SpreadsheetApp.getActiveRange();

  // hide rows and add a ` backtick to the header cell
  for (var row = range.getRow(); row <= range.getLastRow(); row++)
  {
    // add backtick only if it isn't there (that may happen when manually unhiding the rows)
    var cellHeader      = sheet.getRange(row, 1)
    var cellHeaderValue = cellHeader.getValue()    
    if ( !cellHeaderValue.match(/^`/) ) {
      cellHeader.setValue('`' + cellHeaderValue)
    }

    // hide rows of selected range
    sheet.hideRows( row );
  }
}

和菜单

SpreadsheetApp.getActiveSpreadsheet()
.addMenu("Show/Hide", [
    { name : "Hide Selected Rows",    functionName : "hideSelectedRows"    },
    { name : "Hide Selected Columns", functionName : "hideSelectedColumns" },
    null,
    { name : "Hide Rows",             functionName : "hideRows"            },
    { name : "Hide Columns",          functionName : "hideColumns"         },
    null,
    { name : "Show Rows",             functionName : "showRows"            },
    { name : "Show Columns",          functionName : "showColumns"         },
    null,
    { name : "Show All Rows",         functionName : "unHideAllRows"       },
    { name : "Show All Columns",      functionName : "unHideAllColumns"    }
  ])

一旦谷歌工程师找到时间来改进onChange事件,就可以自动添加这些反引号。目前,changeType仅限于EDIT, INSERT_ROW, INSERT_COLUMN, REMOVE_ROW, REMOVE_COLUMN, INSERT_GRID, REMOVE_GRID, OTHER,没有任何有关插入/删除行/列的详细信息。看起来GAS背后的团队很少。我希望他们能聘请更多的程序员(khm khm)

答案 2 :(得分:3)

解决方法。创建2列A和B. A必须始终具有值,B具有一组公式。这两列看起来像这样:

A |           B
---------------------------
1 | =NOT(SUBTOTAL(103, A1))
1 | =NOT(SUBTOTAL(103, A2))
1 | =NOT(SUBTOTAL(103, A3))

SUBTOTAL使用指定的聚合函数返回小计。第一个参数103定义了用于聚合的函数类型。第二个参数是应用函数的范围。

  • 3表示COUNTA并计算范围
  • 中的值的数量
  • +100表示​​忽略范围内的隐藏单元格。

隐藏单元格时,范围为1单元格的SUBTOTAL的结果为0,显示单元格时为1。 NOT反转它。

现在,您可以使用脚本阅读第二列,以了解是否隐藏了一行。

以下是转置的问题和答案:https://stackoverflow.com/a/27846180/1385429

答案 3 :(得分:1)

自2018年起对此问题有用的新API:isRowHiddenByUser。另请参见#include "opencv2/imgproc.hpp" #include "opencv2/imgcodecs.hpp" #include "opencv2/highgui.hpp" #include <iostream> #include <fstream> #include <unistd.h> #include <tuple> using namespace cv; using namespace std; Mat3b canvas; string buttonText("Click me!"); string winName = "My cool GUI v0.1"; Rect button; void callBackFunc(int event, int x, int y, int flags, void* userdata) { if (event == EVENT_LBUTTONDOWN) { if (button.contains(Point(x, y))) { cout << "Clicked!" << endl; rectangle(canvas(button), button, Scalar(0,0,255)); //Help! This is where I get the "no matching function to call" error } } if (event == EVENT_LBUTTONUP) { rectangle(canvas, button, Scalar(200, 200, 200)); } imshow(winName, canvas); waitKey(1); } int main() { // An image Mat3b img(300, 300, Vec3b(0, 255, 0)); // Your button button = Rect(0,0,img.cols, 50); // The canvas canvas = Mat3b(img.rows + button.height, img.cols, Vec3b(0,0,0)); // Draw the button canvas(button) = Vec3b(200,200,200); putText(canvas(button), buttonText, Point(button.width*0.35, button.height*0.7), FONT_HERSHEY_PLAIN, 1, Scalar(0,0,0)); // Draw the image img.copyTo(canvas(Rect(0, button.height, img.cols, img.rows))); // Setup callback function namedWindow(winName); setMouseCallback(winName, callBackFunc); imshow(winName, canvas); waitKey(); return 0; }

答案 4 :(得分:0)

至于解决方法,可以使用SUBTOTAL函数来返回垂直范围的单元格的小计。

语法是:

SUBTOTAL(function_code, range1, [range2, ...])

通过预先设置10(对于单位数字代码),可以跳过任何这些代码的隐藏值。

例如102 COUNT跳过隐藏的单元格,110 VAR执行此操作。

相关:Webapps SE上的Google Spreadsheets sum only shown rows