如何跟踪单元格中值随时间的变化。自我参照挑战
How to keep track of changes over time of a value in a cell. Self referencing challenge
我有一个传播sheet,我必须在其中跟踪包含整数值的单元格的每日变化,并计算今天新获取的数据与昨天的数据之间的差异。我不需要跟踪超过过去 1 天的差异。
定义:
我有一个 google 点差sheet 有 2 sheets:
- “SheetA”显示更新
- “SheetB”今天的数据自动导入 =IMPORTDATA(url)
“SheetB”中每日导入数据的数据结构如下所示:
| 键 | 值 |
|美国广播公司 | 100 |
|防御力 | 123 |
| ... | ... |
数据每天在 00:00 CET 更新 - 这意味着每天早上打开价差sheet 它会自动用新数据更新“SheetB”中的值,我会丢失当天的数据之前。
“SheetA”结构
| 键 | 昨天值 | 今日值 | 差异 |
|美国广播公司 | 100 | 107 | (+或-)7 |
| ... | .... | .... | ... |
“SheetA”必须显示相对于前一天的每日变化。如果从“SheetB”中新导入的数据显示增加了 7,则它应该在“差异”列中显示 +7。差异可以是负数或正数
如何在不丢失前一天数据的情况下计算“SheetA”中的差异?我不需要保留整个历史。我只需要今天的价值和昨天的价值之间的差异。我可以随意修改 sheet。我无法更改源数据,它是用 =IMPORTDATA
导入的 csv
问题是我应该在计算差异后更新昨天的数据。但是没有昨天的数据我无法计算出差异。
提前谢谢你:)
您可以使用另一个 sheet 来存储昨天的数据。
因此 - 为此,您可以使用 Apps 脚本的时间驱动触发器。
代码
// Copyright 2020 Google LLC.
// SPDX-License-Identifier: Apache-2.0
function importYesterday() {
let spreadsheet = SpreadsheetApp.openById("SPREADSHEET_ID");
let yesterdaySheet = spreadsheet.getSheetByName("YESTERDAY");
let todaySheet = spreadsheet.getSheetByName("TODAY");
let data = todaySheet.getRange(ROW, COL, NUM_ROWS, NUM_COLS).getValues();
yesterdaySheet.getRange(ROW, COL, NUM_ROWS, NUM_COLS).setValues(data);
}
function createTrigger() {
ScriptApp.newTrigger('importYesterday')
.timeBased()
.atHour(23)
.create();
}
说明
上面的代码由两个函数组成:
importYesterday
- 用于将数据从 TODAY
sheet导入 YESTERDAY
.
由于IMPORTDATA
在午夜重新计算,这里选择的导入数据的方法是利用getRange
和getValues
来get getRange
和 setValues
的数据和 粘贴 数据到 YESTERDAY
sheet.
请注意,上述方法独立于 IMPORTDATA
的重新计算 - 因此一旦您拥有 YESTERDAY
sheet 中的所有数据,它将保留在那里,除非您专门触发它的变化。
因此,为了始终获取昨天的数据,创建了 createTrigger
函数。
createTrigger
- 用于触发执行importYesterday
函数.
这是通过使用 atHour(23)
方法完成的,这意味着触发器将 运行 大约在 23 点。
所以基本上,数据在 IMPORTDATA
重新计算之前导入到 YESTERDAY
sheet。
后续步骤
至于主要 sheet 中的其他计算,您只需引用 TODAY
和 YESTERDAY
sheet.[=35= 中的单元格即可]
如果您还想根据其他值更新昨天的数据,您可以简单地修改 importYesterday
函数以满足您的需要 and/or 甚至创建另一个专门用于更新值的函数。
备注
您还必须调整 importYesterday
中使用的 getRange
方法,以匹配您拥有的数据范围。
参考
我有一个传播sheet,我必须在其中跟踪包含整数值的单元格的每日变化,并计算今天新获取的数据与昨天的数据之间的差异。我不需要跟踪超过过去 1 天的差异。
定义:
我有一个 google 点差sheet 有 2 sheets:
- “SheetA”显示更新
- “SheetB”今天的数据自动导入 =IMPORTDATA(url)
“SheetB”中每日导入数据的数据结构如下所示:
| 键 | 值 |
|美国广播公司 | 100 |
|防御力 | 123 |
| ... | ... |
数据每天在 00:00 CET 更新 - 这意味着每天早上打开价差sheet 它会自动用新数据更新“SheetB”中的值,我会丢失当天的数据之前。
“SheetA”结构
| 键 | 昨天值 | 今日值 | 差异 |
|美国广播公司 | 100 | 107 | (+或-)7 |
| ... | .... | .... | ... |
“SheetA”必须显示相对于前一天的每日变化。如果从“SheetB”中新导入的数据显示增加了 7,则它应该在“差异”列中显示 +7。差异可以是负数或正数
如何在不丢失前一天数据的情况下计算“SheetA”中的差异?我不需要保留整个历史。我只需要今天的价值和昨天的价值之间的差异。我可以随意修改 sheet。我无法更改源数据,它是用 =IMPORTDATA
导入的 csv问题是我应该在计算差异后更新昨天的数据。但是没有昨天的数据我无法计算出差异。
提前谢谢你:)
您可以使用另一个 sheet 来存储昨天的数据。
因此 - 为此,您可以使用 Apps 脚本的时间驱动触发器。
代码
// Copyright 2020 Google LLC.
// SPDX-License-Identifier: Apache-2.0
function importYesterday() {
let spreadsheet = SpreadsheetApp.openById("SPREADSHEET_ID");
let yesterdaySheet = spreadsheet.getSheetByName("YESTERDAY");
let todaySheet = spreadsheet.getSheetByName("TODAY");
let data = todaySheet.getRange(ROW, COL, NUM_ROWS, NUM_COLS).getValues();
yesterdaySheet.getRange(ROW, COL, NUM_ROWS, NUM_COLS).setValues(data);
}
function createTrigger() {
ScriptApp.newTrigger('importYesterday')
.timeBased()
.atHour(23)
.create();
}
说明
上面的代码由两个函数组成:
importYesterday
- 用于将数据从TODAY
sheet导入YESTERDAY
.
由于IMPORTDATA
在午夜重新计算,这里选择的导入数据的方法是利用getRange
和getValues
来get getRange
和 setValues
的数据和 粘贴 数据到 YESTERDAY
sheet.
请注意,上述方法独立于 IMPORTDATA
的重新计算 - 因此一旦您拥有 YESTERDAY
sheet 中的所有数据,它将保留在那里,除非您专门触发它的变化。
因此,为了始终获取昨天的数据,创建了 createTrigger
函数。
createTrigger
- 用于触发执行importYesterday
函数.
这是通过使用 atHour(23)
方法完成的,这意味着触发器将 运行 大约在 23 点。
所以基本上,数据在 IMPORTDATA
重新计算之前导入到 YESTERDAY
sheet。
后续步骤
至于主要 sheet 中的其他计算,您只需引用 TODAY
和 YESTERDAY
sheet.[=35= 中的单元格即可]
如果您还想根据其他值更新昨天的数据,您可以简单地修改 importYesterday
函数以满足您的需要 and/or 甚至创建另一个专门用于更新值的函数。
备注
您还必须调整 importYesterday
中使用的 getRange
方法,以匹配您拥有的数据范围。