如何跟踪单元格中值随时间的变化。自我参照挑战

How to keep track of changes over time of a value in a cell. Self referencing challenge

我有一个传播sheet,我必须在其中跟踪包含整数值的单元格的每日变化,并计算今天新获取的数据与昨天的数据之间的差异。我不需要跟踪超过过去 1 天的差异。

定义:

我有一个 google 点差sheet 有 2 sheets:

  1. “SheetA”显示更新
  2. “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在午夜重新计算,这里选择的导入数据的方法是利用getRangegetValuesget getRangesetValues 的数据和 粘贴 数据到 YESTERDAY sheet.

请注意,上述方法独立于 IMPORTDATA 的重新计算 - 因此一旦您拥有 YESTERDAY sheet 中的所有数据,它将保留在那里,除非您专门触发它的变化。

因此,为了始终获取昨天的数据,创建了 createTrigger 函数。

  • createTrigger - 用于触发执行importYesterday函数.

这是通过使用 atHour(23) 方法完成的,这意味着触发器将 运行 大约在 23 点。

所以基本上,数据在 IMPORTDATA 重新计算之前导入到 YESTERDAY sheet。

后续步骤

至于主要 sheet 中的其他计算,您只需引用 TODAYYESTERDAY sheet.[=35= 中的单元格即可]

如果您还想根据其他值更新昨天的数据,您可以简单地修改 importYesterday 函数以满足您的需要 and/or 甚至创建另一个专门用于更新值的函数。

备注

您还必须调整 importYesterday 中使用的 getRange 方法,以匹配您拥有的数据范围。

参考