我有一个电子表格: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,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 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
列的最后一行包含文本,则使用我在那里的公式,但我也不知道该怎么做。
答案 0 :(得分:2)
在通过工作表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)),1,2)&"."&MID(C2:INDEX(C:C,COUNTA(C:C)),3,2)&".2020"})
使用regex或:
=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的其余部分会自动填充。
我们在标题行{"Extracted Date";Formula for rest of the column}
无论何时出现新行,INDEX/COUNTA()
都会自动计算最后一行并自动将公式填充到最后一行。有关INDEX/COUNTA
的更详细说明,请参见here。
答案 1 :(得分:0)
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
);
};