【问题标题】:How to Autofill last row with formula, when data is received from IFTTT on the last row?当最后一行从 IFTTT 接收到数据时,如何用公式自动填充最后一行?
【发布时间】:2020-12-29 09:49:32
【问题描述】:

我有一个电子表格:https://docs.google.com/spreadsheets/d/1df2cp4DsJvSeBvhsNjLgIa5x_RO1X7s_APRdFzU6jqQ/edit?usp=sharing

|    | C                               | D              |
|----+---------------------------------+----------------|
| 1> | From IFTTT                      | Extracted Date |
| 2> | 0809 1800 0909 0600 RLK Steiger | 08.09.2020     |
| 3> | 0809 1800 0909 0600 RLK Dvorak  | 08.09.2020     |
| 4> | 0909 0600 0909 1800 UNIS Brando | 09.09.2020     |

我通过 android 程序“IFTTT”自动收到短信的地方,我在那里有公式来计算从短信正文中获取的工作时间、日期等。

|    | C                               | D                                         |
|----+---------------------------------+-------------------------------------------|
| 1> | From IFTTT                      | Extracted Date                            |
| 2> | 0809 1800 0909 0600 RLK Steiger | =MID(C2,1,2)&"."&MID(C2,3,2)&".2020"      |
| 3> | 0809 1800 0909 0600 RLK Dvorak  | =MID(C3,1,2)&"."&MID(C3,3,2)&".2020"      |
| 4> | 0909 0600 0909 1800 UNIS Brando | //<= New row from IFTTT. Set formula here |

我现在遇到的问题是 android 程序总是将 SMS 放在最后一个空白行。所以我不能在那里预先设置公式,因为那样它就在公式之下,除非手工完成,否则它是无用的。

我已尝试使用 Google Apps 脚本。无论如何如何通过Google表格宏来做到这一点?我尝试了以下方法:

function myFunction() {    
  var spreadsheet = SpreadsheetApp.getActive();       
   spreadsheet.getRange('D1').activate();
   spreadsheet.getCurrentCell().setFormula('=if(isnumber(A1);mid(C1;1;2)&"."&mid(C1;3;2)&".2020";""))

但是,如果使用它,那么它不会使单元格为空,但其中包含公式,而且我必须为每个单元格执行此操作。我的想法是 if(set the formula) else 删除它,但我不知道如何用 Javascript 编写。

理想情况下,如果D:D 列的最后一行包含文本,则使用我那里的公式,但我也不知道该怎么做。

【问题讨论】:

  • 我必须为我糟糕的英语水平道歉。不幸的是,根据您的问题和共享的电子表格,我无法理解您当前的问题和目标。我无法理解您共享电子表格中的 3 张表格。而且,我无法理解My idea was that if(set the formula) else delete it 和Ideally it would be that if column D:D last row contains text, then use the formulas I have there。可以问一下他们的详细情况吗?
  • 嗨,很抱歉回答迟了。当然。第一张纸是我从程序本身获得自动短信的地方。第二个有周末工作时间,晚上工作等的计数。最后一个“SMS-tabulka”我试图解决SMS转到最后一个空白行的问题,只需将数据复制到新的工作表,但不幸的是,这没有用,因为它会将所有公式移动 1。
  • 感谢您回复并添加更多信息。现在我注意到已经发布了答案。在这种情况下,我想尊重现有的答案。我认为它会解决您的问题。
  • @Tanaike 如果您愿意,可以随意添加任何其他答案或方法。您发布另一个答案并不是不尊重我的答案。
  • @TheMaster 感谢您的回复。当我找到其他解决方案时,我想提出它。

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


【解决方案1】:

在通过 sheet api 或 Google forms 处理自动插入的数据时,这是一个非常常见的问题。最简单的解决方案是将所有公式转换为arrayformulas。例如,您在 D2 中的公式

=MID(C2,1,2)&"."&MID(C2,3,2)&".2020

可以修改为

在第一天:

=ARRAYFORMULA({"Extracted Date";MID(C2:INDEX(C:C,COUNTA(C:C)),1,2)&"."&MID(C2:INDEX(C:C,COUNTA(C:C)),3,2)&".2020"})

或者使用:

=ARRAYFORMULA({"Extracted Date";REGEXREPLACE(C2:INDEX(C:C,COUNTA(C:C)),"(\d{2})(\d{2}).*","$1.$2.2020")})

然后表格变成:

|    | C                               | D                                                                                                                   |
|----+---------------------------------+---------------------------------------------------------------------------------------------------------------------|
| 1> | From IFTTT                      | =ARRAYFORMULA({"Extracted Date";MID(C2:INDEX(C:C,COUNTA(C:C)),1,2)&"."&MID(C2:INDEX(C:C,COUNTA(C:C)),3,2)&".2020"}) |
| 2> | 0809 1800 0909 0600 RLK Steiger |                                                                                                                     |
| 3> | 0809 1800 0909 0600 RLK Dvorak  |                                                                                                                     |
| 4> | 0909 0600 0909 1800 UNIS Brando |                                                                                                                     |

这里 D:D 的其余部分是自动填充的。

  • 我们在标题行使用array literals:{"Extracted Date";Formula for rest of the column}

  • 每当出现新行时,INDEX/COUNTA() 自动计算最后一行并自动将公式填充到最后一行。有关INDEX/COUNTA 的更深入解释,请参阅here。

【讨论】:

  • 您好,非常感谢您的帮助!我试过这样做,但我不知道为什么,但由于我假设的语言存在一些差异。例如我不能使用 ,但我必须使用 ;没关系,我可以检查一下。但是它不会填满表格,因为根据工作表,MID 函数有 3 个参数而不是 3 个。我不确定我在那里做错了什么?如果可能的话 - 我不想打扰太多,这已经是很大的帮助了!要从另一张表“List2”中获取数据,可以使用函数 counta 对吗?再次感谢您!
  • @PatrikGremlica 关于 mid,你能在这里显示你编辑的当前公式吗?请针对不相关的问题提出新问题
  • 嗨,好的,对不起,这是我自己第一次使用这个网站,我真的很感激这个,也编辑了原始问题。我用过这个,不幸的是它会翻译成捷克语: =ARRAYFORMULA({"Datum";ČÁST(C2;INDEX(C:C;POČET2(C:C));1;2)&"."&ČÁST( C2;INDEX(C:C;POČET2(C:C));3;2)&".2020"})
  • @PatrikGremlica =ARRAYFORMULA({"Datum";ČÁST(C2:INDEX(C:C;POČET2(C:C));1;2)&amp;"."&amp;ČÁST(C2:INDEX(C:C;POČET2(C:C));3;2)&amp;".2020"})
  • @PatrikGremlica 这不应该发生。 C:C 的行之间是否有额外的空格?如果是这样,您应该删除它。或者,只需将 +1 添加到两个计数:COUNTA(...)+1。如果通过单击答案左侧的复选标记有帮助,请考虑接受答案。
【解决方案2】:

解决办法:

  • 此解决方案使用。这不需要数组公式,但使用自动填充。要使解决方案发挥作用,您不应使用数组公式,而应使用普通公式。
  • 获取活动范围,它将表示当前插入的 onChange 或 onFormSubmit 范围。
  • offset右边的范围获取计算列,并将范围扩展到右边的所有计算列。
  • 使用range.autoFillToNeighbor 填充范围的所有计算区域。

示例脚本:

/**
 * @param {GoogleAppsScript.Events.SheetsOnChange|GoogleAppsScript.Events.SheetsOnFormSubmit} e
 */
const onFormSubmitORonChange = e => {
  const rg = SpreadsheetApp.getActiveRange(),
    wd = rg.getWidth(),
    sh = rg.getSheet(),
    lc = sh.getLastColumn(),
    numRows = Math.max(
      rg
        .offset(0, wd, 1, 1)
        .getNextDataCell(SpreadsheetApp.Direction.UP)
        .getRow() - 1,
      1
    ),
    numCols = lc - wd;
  sh.getRange(2, wd + 1, numRows, numCols).autoFillToNeighbor(
    SpreadsheetApp.AutoFillSeries.DEFAULT_SERIES
  );
};

参考资料:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-08
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 2014-11-05
    • 1970-01-01
    相关资源
    最近更新 更多