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
。这时候计算出C55
和D55
。您想要将 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);
}
}
参考:
我有以下电子表格(这是它的理想开始状态):
当您在黄色字段 (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
。这时候计算出C55
和D55
。您想要将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);
}
}