为什么我的宏仅在第一个实例之后才不能正确地复制/粘贴值?

时间:2019-08-03 17:43:37

标签: google-apps-script google-sheets copy copy-paste google-sheets-macros

更新了所有内容,包括此电子表格的最终目标 和我在早期测试中遇到的问题,以便如果有更好的方法可以使有经验的人可以识别,则可以更改我的方法并改为这样做。

Link to copy of sheet here

问题: 此宏使用两次特殊粘贴(仅值),但仅正确粘贴第一个,而对第二个则不执行任何操作。例如,第一个实例从C6复制数据并将其值仅粘贴到F6。第二个从K6复制并仅将值粘贴到M6,而不会粘贴。除此之外,其他所有功能都正常运行。

对于上下文,此宏还在两个复制/粘贴操作之间向下复制一个公式。您还将在下面看到该代码。它按预期工作,因此您可以忽略它。

在下面的帮助下,我们确定了问题在于仅第二个粘贴值功能无法正常工作,因为它正在复制该单元格,然后该单元格才能完成其公式的求和。

例如,假设K6为= sum(K4 + K5),其中K4 = 1,k5 = 4。在总和可以在该单元格中记录答案“ 5”之前,副本正在获取空数据并将其粘贴,因此不粘贴任何内容。

我尝试设置使用睡眠的延迟,但这不是一个一致的解决方案。它仅在大约50%的时间内起作用。如果可以基于让公式完成其输出来设置延迟,那将是一个完美的解决方案。如果有人有类似问题的经验或对优化线程的建议,请在下面链接。如果找到解决方案,我会环回。

目标和背景: 这是内部跟踪器的模型,我们使用它来根据项目(以分钟为单位)衡量可用性(分钟),以大致确定何时完成项目。我们使用此跟踪器来确定是否会迟到,是否可以从我们的团队中进行更多的项目,等等。这些都是手动的,并且没有专门的脚本专家。

现在,我们的解决方案是在基本和公式的帮助下在每个单元格中手动输入可用性。这会花费很多时间,并且容易出现人为错误。因此,我正试图通过我在脚本/宏方面的非常有限的经验来为我们做数学运算的宏。

在“理想”选项卡中,我手动创建了一个我最终要实现的目标的示例-一个宏,该宏根据可用性对项目的分钟数进行求和并输入数据。我显然是新来的,所以不可避免地存在效率低下的问题,我可能完全走错了路。如果是这样,请告诉我并给我一个解释,就像您正在与具有基本计算机知识的祖父母说话一样。

感谢大家的帮助!

代码如下:

function TestCalc1() {
  var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.getRange('D5:H5').activate();
  spreadsheet.getActiveRange().autoFill(spreadsheet.getRange('D5:H6'), SpreadsheetApp.AutoFillSeries.DEFAULT_SERIES);
  spreadsheet.getRange('I6').activate();
  spreadsheet.getRange('H6').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
  spreadsheet.getRange('H6').activate();
};

1 个答案:

答案 0 :(得分:-1)

尝试一下

function TestCalc1() {
  var spreadsheet = SpreadsheetApp.getActive();
  var cellsD5H5 = spreadsheet.getRange("D5:H5").getValues();
  spreadsheet.getRange("D6:H6").setValues(cellsD5H5);
  var cellH6 = spreadsheet.getRange("H6").getValues();
  spreadsheet.getRange("I6").setValues(cellH6);
  //spreadsheet.getRange("H6").activate();
};

getValues()- https://developers.google.com/apps-script/reference/spreadsheet/range#getValues()