【问题标题】:How do you apply a JOIN and FILTER formula to an entire column in Google Sheets using Google Script?如何使用 Google Script 将 JOIN 和 FILTER 公式应用于 Google 表格中的整个列?
【发布时间】:2020-09-22 01:47:11
【问题描述】:

我对 Google 脚本非常陌生,因此非常感谢任何帮助。

我不知道如何将同时使用 JOIN 和 FILTER 的公式应用于 Google 表格中的整个列。

我的公式是:=JOIN(", ",FILTER(N:N,B:B=R2))

我需要将此公式添加到 S 列中的每个单元格(标题单元格除外),但每行的“R2”都在变化,因此在第 3 行它是“R3”,第 4 行它是“R4”等。

此公式适用于 Google 工作表本身,但由于我每天都有自动替换为新更新版本的工作表,因此我需要设置一个 google 脚本以在特定时间运行,我可以通过触发器设置该脚本以将此公式添加到我的指定列。

我尝试了一些我在网上找到的脚本,但都没有成功。

【问题讨论】:

  • 分享您的电子表格样本总是一个好主意,以便人们可以通过具体示例帮助您。不共享工作表会使人们思考得更加困难,有时他们不愿意这样做。
  • 您能否提供更多关于sheet that is auto replaced by a new updated version daily 的详细信息?床单如何更换?它是通过基于应用程序脚本时间的触发器吗?如果是这种情况,请考虑分享相应的代码。
  • 嗨@Nabnub 我从我的工作表中抽取了一个样本,请参阅下面的链接。 docs.google.com/spreadsheets/d/…
  • 嗨@Iamblichus - 工作表正在被覆盖文件的第三方应用程序 (CloudHQ) 替换。
  • 不是这样的=JOIN(",",FILTER(A2:N2,B2==R2))

标签: google-apps-script google-sheets


【解决方案1】:

如果您只想使用公式解决此问题:

由于您的公式始终采用以下格式:

=JOIN(", ",FILTER(N:N,B:B=R<ROW NUMBER>))

并且你想将它应用到非常多的行,你可以使用 INDIRECT 和 ROW 来实现动态公式。 This answer 有一个很好的例子来说明如何使用它。

使用公式不会遇到 Apps 脚本的时间限制

实际上,如果您的数据位于 A 列,您可以写 =ARRAYFORMULA(CONCAT("R",ROW(A2:A))) 来获得如下信息:

您的最终公式应如下所示:

=JOIN(", ",FILTER($N:$N,B:B=INDIRECT(CONCAT("R",ROW($R2)))))

此外,您可以像任何其他公式一样将其拖到其他单元格!

【讨论】:

    【解决方案2】:

    通过 Apps 脚本设置公式:

    您可以使用setFormulas(formulas) 为区域中的所有单元格设置一组公式。 formulas,在这种情况下,指的是一个二维数组,外部数组代表不同的行,每个内部数组代表每个特定行中的不同列。您应该使用不同的公式构建这个二维数组,同时考虑到来自R 的行索引对于每个单个公式应该是不同的。

    你可以这样做:

    function settingFormulas() {
      var sheet = SpreadsheetApp.getActive().getSheetByName("Sheet1");
      var firstRow = 2;
      var column = 19; // Column S index
      var range = sheet.getRange(firstRow, column, sheet.getLastRow() - firstRow + 1);
      var formulas = range.getValues().map((row, index) => {
        let rowIndex = index + firstRow;
        return ["=JOIN(\", \",FILTER(N:N,B:B=R" + rowIndex + "))"];
      });
      range.setFormulas(formulas);
    }
    
    • 在此函数中,map 方法中的可选 index 参数用于跟踪行索引,并将其添加到公式中。
    • 在此函数中,sheet name 用于标识函数必须将公式设置到哪个工作表(在本例中,名称为 Sheet1)。这里我假设一旦工作表被更新的工作表替换,工作表名称保持不变。

    每天执行:

    一旦你有了这个函数,你只需要安装时间驱动触发器来每天执行这个函数,或者手动,按照these steps,或者programmatically,运行一次这个函数:

    function creatingTrigger() {
      ScriptApp.newTrigger("settingFormulas")
        .timeBased()
        .everyDays(1)
        .create();
    }
    

    参考:

    【讨论】:

    • @lamblichus 太棒了,谢谢!但是,我收到以下错误代码: SyntaxError: Identifier 'row' has been declared (line 7, file "Code.gs")
    • @AdamNewman 我的错,我没有注意到 row 之前被声明过。我将其更改为rowIndex,它现在应该可以工作了。如果有,请告诉我;)
    • @lamblichus 你这个超级巨星!这正是我所追求的,非常感谢!但是,当我在包含 45,000 多行数据的实际工作表上使用它时,确实会出现一条错误消息。 例外:访问具有 ID 的文档时服务电子表格超时有什么想法吗?
    • @lamblichus 只是一个想法,但是否可以调整此脚本以应用于前 10,000 行,然后创建另外 4 个单独的脚本以运行 10,001-20,000 等?
    • @AdamNewman 是的,您可以通过使用PropertiesService 存储和检索indexafter 再次调用settingFormulas 并在之后开始新的执行,将迭代拆分为几个不同的执行current 已经达到一定的迭代次数,接近执行时间限制(6 分钟)。以this answer 为例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-21
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多