Google apps script 使用Google Apps脚本获取工作表中包含特定列为空的数据的所有行

Google apps script 使用Google Apps脚本获取工作表中包含特定列为空的数据的所有行,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我们的团队有一个谷歌表单,我们用它来获取信息。一旦提交了一个入口,我就会有一个GAS脚本来处理它(在googledrive中创建一些文件,发送一些电子邮件,等等) 我使用每小时一次的触发器,而不是在与表单链接的电子表格的on form submit事件上触发。有一个具体的原因,这是超出了这个问题的范围,但我可以解释,如果需要的话 链接到表单的电子表格最终将有数千行 我的脚本将遍历每个未处理的行。我在电子表格上添加了一列,以跟踪哪些行已被处理。当一行被处理时,一些字符串被添加到列a。对于未处理的行

我们的团队有一个谷歌表单,我们用它来获取信息。一旦提交了一个入口,我就会有一个GAS脚本来处理它(在googledrive中创建一些文件,发送一些电子邮件,等等)

我使用每小时一次的触发器,而不是在与表单链接的电子表格的on form submit事件上触发。有一个具体的原因,这是超出了这个问题的范围,但我可以解释,如果需要的话

链接到表单的电子表格最终将有数千行

我的脚本将遍历每个未处理的行。我在电子表格上添加了一列,以跟踪哪些行已被处理。当一行被处理时,一些字符串被添加到列a。对于未处理的行,列a将为空

我试图找到最快、最有效的方法来获取所有未处理的行——列A为空的行

初步想法:

  • 使用
    Sheet.getDataRange().getValues()
    获取所有行,迭代每个行,并处理未处理的行。然后使用该行的索引标记电子表格上处理的行。这种方法可以工作,但在电子表格有数千行之后,这种方法会变得非常缓慢
  • 对电子表格应用筛选器,并对a列为空的行进行筛选。我可以应用过滤器,但似乎没有一种简单的方法来获取所有可见行及其行号,以便我可以标记它们已处理
然后我发现我可以在第二张工作表上使用
query
函数来显示列a为空的所有行,然后我可以在脚本中使用该工作表来处理需要处理的内容

=query('Form Responses'!A:V, "SELECT * WHERE A IS NULL")
但这不包括
表单响应
表中的行号,因此我不知道在
表单响应
上返回哪一行以标记已处理

=query('Form Responses'!A:V, "SELECT * WHERE A IS NULL")
我可以使用
arrayformula
添加行号,如下所示:

=query({arrayformula(row('Form Responses'!A:V)), 'Form Responses'!A:V}, "SELECT * WHERE Col2 IS NULL")
但这会添加一组带有数字的行,即使源表中没有该行的数据

如果我不包括行号,它仍然无法工作,因为如果我在具有
query
函数的工作表上调用
Sheet.getDataRange()
,它返回的行数将超过数据量

我做了一个例子表-


那么,有没有一种快速有效的方法来获取工作表中特定列为空的所有数据行?使用
query
或其他方式?

对于查找工作表中某个值的位置的纯应用程序脚本答案,可以使用
TextFinder
(我不确定这是否适用于空字段)或
getValues()
,循环应该足够快。您可以考虑使用<代码> GETValues()/<代码>,或者根据您所寻找的值排序数组,或者例如,如果您希望寻找新的项目,则从最近的条目开始循环。p>
但是,如果您使用的是图纸公式,则可以轻松地将
=row()
添加到列(或例如
=arrayformula(row(A2:a))
)中,以便
=query
的结果返回行号。如果出于任何原因无法将此列添加到原始工作表中,也可以将查询结果用作搜索键,将原始工作表用作范围,具体取决于电子表格的结构

通常,我会执行getValues()和循环,而且速度足够快。但这可能因工作表的内容和组织的配额而异。如果您打算使用
=query
,为什么不简单地在主工作表中添加一列
=arrayformula(行(A2:a))
,这样您就可以参考行号了?@Altigraph您真是太棒了!我将
arrayformula
添加到
表单响应
表中,然后在第二张表中我基本上执行了
=query('formresponses
!A:Z,“SELECT*其中B为NULL,C为notnull”)`。这就成功了。非常感谢。如果你把你的想法作为答案,我会把它标记为接受。