当前位置: 首页 > 知识库问答 >
问题:

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

宋昕
2023-03-14

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

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

链接到窗体的电子表格最终将有数千行。

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

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

初步想法:

  • 使用工作表。getDataRange()。getValues()要获取所有行,请遍历每一行,并处理未处理的行。然后使用该行的索引标记电子表格上处理的行。这种方法可以工作,但在电子表格有数千行之后,这种方法会变得非常缓慢
  • 对电子表格应用筛选器,并对a列为空的行进行筛选。我可以应用过滤器,但似乎没有一种简单的方法来获取所有可见行及其行号,以便我可以标记它们已处理

然后我发现我可以在第二张工作表上使用query函数来显示列a为空的所有行,然后我可以在脚本中使用该工作表来处理需要处理的内容。

=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")

但是这会添加一堆带有数字的行,即使源表在该行中没有数据。

如果我不包括行号,它仍然不起作用,因为如果我在具有查询函数的工作表上调用Sheet.getDataRange(),它返回的行比数据多。

我做了一个例子-https://docs.google.com/spreadsheets/d/1LYpqfj3clZiaGCPgp_eRfrxhQKWambRyQn3uNCFAIpU/edit?usp=sharing.

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

共有1个答案

许安邦
2023-03-14

对于查找工作表中某个值的位置的纯应用程序脚本答案,TextFinder(我不确定这是否适用于空字段)或getValues(),循环应该足够快。您可以考虑在使用<代码> GETValueSes()/Cux>之前排序该表,或者根据您所寻找的值排序数组,或者,例如,如果您期望寻找新的项目,则从最近的条目开始循环。

但是,如果您使用Sheets的公式,您可以轻松地将=row()添加到列(或例如=array公式(row(A2: A))),这样=Query的结果返回行号。如果由于任何原因无法将此列添加到原始工作表中,那么根据电子表格的结构,使用匹配将查询结果作为搜索键,将原始工作表作为范围也可以。

 类似资料:
  • 我是正则表达式的新手,我不能做我需要的。 假设我们有这样一段文字: 我需要得到所有包含“los gatos”文本的标签。 它应该匹配4个巧合: 如何用正则表达式解决它? 编辑: 我终于找到了我需要的!我分享给任何可能需要它的人:

  • 我有一个看起来像这样的数据集: 我正在尝试对数据进行分组,以便只获取整个数据集,包括时间戳:00:00:00(年份和月份无关紧要)。我使用了groupby(data.index.time),但这并不能满足我的需求。 我在考虑是否可以使用for循环,但我不确定如何获得整行数据,而不仅仅是我之前在dataframe上使用的特定值。 我想日期索引,并将其分成日期和时间列,然后: 这种方法有两个问题。1)

  • 本文向大家介绍如何使用python获取Selenium中工作表中列的所有值?,包括了如何使用python获取Selenium中工作表中列的所有值?的使用技巧和注意事项,需要的朋友参考一下 我们可以在Selenium中的工作表中获取列的所有值。Excel是电子表格,扩展名为.xlsx。一个excel工作簿有多个工作表,每个工作表都由行和列组成。 在所有工作表中,当我们访问一个称为活动工作表的特定工作

  • 问题内容: 有什么方法可以简化此代码,以获取提供的某一列的索引以获取特定行的索引吗?在这种情况下,索引将为,因为我要遍历第一列直到找到“ A”。感觉应该对此有一个linq解决方案,但我无法弄清楚。 问题答案: 如果使用DataTableExtensions.AsEnumerable()方法,则可以使用LINQ查询您的DataTable。然后,您可以用来确定给定谓词的索引:

  • 问题内容: 实际上我已经用谷歌搜索了一下,我需要对应的SELECT命令来跟随下面的PostgreSQL shell命令: 我设法用以下代码获取所有数据库: 我尝试了以下声明,但没有运气: 这是我得到的错误: 问题答案: 要列出数据库中的所有表,您必须读取表, 但是不幸的是,您必须登录数据库。所以在你写评论的地方 在循环表之前,您需要登录该数据库。

  • 我正在使用主动选择插件,具有时髦的脚本,可以检索 Jenkins 中所有作业的名称。我可以写一个时髦的脚本来获取该特定作业的所有内部版本号的列表吗?