当从IFTTT的最后一行接收到数据时,如何用公式自动填充最后一行? 解决方案:示例脚本:参考文献:

问题描述

我有一个电子表格: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     |

在自动获取SMS的地方,我使用了Android程序“ IFTTT”,然后使用公式来计算从SMS正文获取的工作时间,日期等。

|    | 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,2)&"."&MID(C3,2)&".2020"      |
| 4> | 0909 0600 0909 1800 UNIS Brando | //<= New row from IFTTT. Set formula here |

我现在遇到的问题是,Android程序始终会将SMS放在最后的空白行。因此,我无法在此处预先设置公式,因为它进入了公式之下,并且手动完成了有用的叔叔。

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

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(设置公式)else删除它,但我不知道如何用Javascript编写。

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

解决方法

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

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

可以修改为

在D1中:

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

使用或:

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

该表将变为:

|    | C                               | D                                                                                                                   |
|----+---------------------------------+---------------------------------------------------------------------------------------------------------------------|
| 1> | From IFTTT                      | =ARRAYFORMULA({"Extracted Date";MID(C2:INDEX(C:C,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的其余部分会自动填充。

  • 我们在标题行{"Extracted Date";Formula for rest of the column}

    上使用array literals
  • 无论何时出现新行,INDEX/COUNTA()都会自动计算最后一行并自动将公式填充到最后一行。有关INDEX/COUNTA的更详细说明,请参见here

,

解决方案:

  • 此解决方案使用。这不需要数组公式,但是使用自动填充。为使该解决方案有效,您不应使用数组公式,而应使用普通公式。
  • 获取活动范围,该范围将表示插入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)
        .getNextDataCell(SpreadsheetApp.Direction.UP)
        .getRow() - 1,1
    ),numCols = lc - wd;
  sh.getRange(2,wd + 1,numRows,numCols).autoFillToNeighbor(
    SpreadsheetApp.AutoFillSeries.DEFAULT_SERIES
  );
};

参考文献:

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...