我有一个包含许多隐藏行的Google电子表格,我想在迭代电子表格中的行列表时跳过它们。
这主要是一个效率问题,因为我正在处理超过一半的行被隐藏而且无需检查。
任何帮助都将不胜感激。
答案 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定义了用于聚合的函数类型。第二个参数是应用函数的范围。
COUNTA
并计算范围隐藏单元格时,范围为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