Google 表格宏中的结果不一致?

Inconsistent results in Google Sheets macros?

我有以下电子表格(这是它的理想开始状态):

当您在黄色字段 (B55) 中输入数字时,会计算 C55 和 D55(基于与问题无关的其他内容)。

这是我需要一个宏来做的事情:(1) 复制 B58,然后将值(“1”)粘贴到 B55 中。这将更改C55 和D55 的值。(2) 复制C55,将值粘贴到C58 中。 (3) 复制D55,粘贴D58的值。 (4) 重复步骤 1-4,但这次是第 59 行。(5) 重复,但是第 60 行。(6) 等等

所以如果脚本只 运行 一次(在 B58 上),它应该看起来像 ...

如果脚本 运行 包含 4 行年份数据 (B58-B61),并且这是下面的脚本代码应该执行的操作,输出应该如下所示:

确实应该 运行 20 次迭代,最终值为“100”年。但为了简洁和说明问题,我在“15”处停了下来。但比方说,我在黄色字段中输入 100,我得到 ...

如果此时我是 运行 脚本,但是,我得到...

看看他们怎么都是一样的值?我录制的宏是复制 C55 和 D55 中的最后一个条目,而不是 1、5、10 等的计算值

我做错了什么?

这是它创建的脚本:


function TEST1() {
  var spreadsheet = SpreadsheetApp.getActive();

  spreadsheet.getRange('B55').activate();
  spreadsheet.getRange('B58').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
  spreadsheet.getRange('C58').activate();
  spreadsheet.getRange('C55').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
  spreadsheet.getRange('D58').activate();
  spreadsheet.getRange('D55').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);

  spreadsheet.getRange('B55').activate();
  spreadsheet.getRange('B59').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
  spreadsheet.getRange('C59').activate();
  spreadsheet.getRange('C55').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
  spreadsheet.getRange('D59').activate();
  spreadsheet.getRange('D55').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);

  spreadsheet.getRange('B55').activate();
  spreadsheet.getRange('B60').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
  spreadsheet.getRange('C60').activate();
  spreadsheet.getRange('C55').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
  spreadsheet.getRange('D60').activate();
  spreadsheet.getRange('D55').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);

  spreadsheet.getRange('B55').activate();
  spreadsheet.getRange('B61').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
  spreadsheet.getRange('C61').activate();
  spreadsheet.getRange('C55').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
  spreadsheet.getRange('D61').activate();
  spreadsheet.getRange('D55').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
};

注意:这是对较大要求的简化。需要一个宏,我无法将 table 变成多个公式。

  • 您想将 B58 复制到 B55。这时候计算出C55D55。您想要将 C55:D55 的计算值复制到 C58:D58
    • 您想要 运行 每行的此流程。
  • 您想通过修改脚本来实现。

我可以像上面那样理解。如果我的理解是正确的,这个答案怎么样。请将此视为几个答案之一。

修改点:

  • 在您的情况下,为了计算值,请使用 SpreadsheetApp.flush()SpreadsheetApp.flush() 为 运行 后,复制计算值。

模式 1:

在此模式中,您的脚本已修改。请修改如下。

修改后的脚本:

function TEST1() {
  var spreadsheet = SpreadsheetApp.getActive();

  spreadsheet.getRange('B55').activate();
  spreadsheet.getRange('B58').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
  SpreadsheetApp.flush(); // Added
  spreadsheet.getRange('C58').activate();
  spreadsheet.getRange('C55').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
  spreadsheet.getRange('D58').activate();
  spreadsheet.getRange('D55').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);

  spreadsheet.getRange('B55').activate();
  spreadsheet.getRange('B59').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
  SpreadsheetApp.flush(); // Added
  spreadsheet.getRange('C59').activate();
  spreadsheet.getRange('C55').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
  spreadsheet.getRange('D59').activate();
  spreadsheet.getRange('D55').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);

  spreadsheet.getRange('B55').activate();
  spreadsheet.getRange('B60').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
  SpreadsheetApp.flush(); // Added
  spreadsheet.getRange('C60').activate();
  spreadsheet.getRange('C55').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
  spreadsheet.getRange('D60').activate();
  spreadsheet.getRange('D55').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);

  spreadsheet.getRange('B55').activate();
  spreadsheet.getRange('B61').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
  SpreadsheetApp.flush(); // Added
  spreadsheet.getRange('C61').activate();
  spreadsheet.getRange('C55').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
  spreadsheet.getRange('D61').activate();
  spreadsheet.getRange('D55').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
};

模式二:

在此模式中,声明了要检索的起始行和结束行,并在 for 循环中复制了值。请修改如下。

修改后的脚本:

function TEST1() {
  var startRow = 58; // Please set the start row. In this case, it's row 58.
  var endRow = 61; // Please set the start row. In this case, it's row 61.

  var spreadsheet = SpreadsheetApp.getActive();
  for (var row = startRow; row <= endRow; row++) {
    spreadsheet.getRange("B" + row).copyTo(spreadsheet.getRange("B55"), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
    SpreadsheetApp.flush();
    spreadsheet.getRange("C55:D55").copyTo(spreadsheet.getRange("C" + row + ":D" + row), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
  }
}

参考: