【问题标题】:How to update formulas in a Sheet when copying reference sheet into current spreadsheet将参考表复制到当前电子表格时如何更新工作表中的公式
【发布时间】:2018-03-14 23:13:08
【问题描述】:

我有两个电子表格 A 和 B,我正在编写一个脚本来将它们与每个业务部门的自定义合并。

电子表格 A 包含一个“计算”工作表,其中的公式引用了一个名为“材料”的工作表,但它不包含“材料”工作表。

我编写了将“材料”表从电子表格 B 复制到电子表格 A 的脚本。

var materialsSheet = spreadSheetB.getSheetByName("Materials");
materialsSheet.copyTo(spreadSheetA).setName("Materials");

但是,SpreadsheetA 中“计算”表上的公式仍然抱怨“未找到材料”表。如果我手动进入前端并模拟编辑,单元格中的值会更新。

我尝试复制公式并通过 Apps-Script 将它们粘贴回去,但它不起作用。有关如何使其工作的任何建议?

var readRange = calcSheet.getRange(9,1,7,6);
readRange.copyTo(calcSheet.getRange(9,1,7,6));

另一种思路:我的猜测是“材料”表在 G-sheets 内部使用一些参考 ID 进行引用,而不是其名称。如何以编程方式更新内部引用?

更新:我的问题被确定为另一个问题的可能重复项,该问题在其公式中使用“间接”。我不在电子表格中使用“间接”,它将地址作为字符串接收并返回参考地址。这不是我正在寻找的功能,所以我无法将它添加到我的工作表公式中。我确实尝试了针对该问题的建议解决方案(使用 IFERROR),但它也没有帮助。我只是在出错的情况下返回 null 值。

【问题讨论】:

  • 当你说“如果我手动进入前端并模拟编辑,单元格中的值会更新”,你的意思是在编辑后,你的公式中的引用能够找到复制的工作表,但在那之前他们不能?
  • @Argyll 您的理解是正确的。该公式需要在前端进行虚假编辑才能使其工作。使用 Google Apps-Script 将公式复制/粘贴回工作表没有相同的效果。
  • 你试过flush()吗?
  • 我没有尝试flush(),但是我手动重新加载了几次电子表格,但没有任何影响。我猜手动重新加载比 flush() 做的事情更多,所以我会看到它,对吧?
  • @J.Doe:我不确定是不是这样。手动重新加载正在再次打开工作表。某些更新可能由编辑触发。试试flush 看看是否有效?

标签: google-apps-script google-sheets


【解决方案1】:

这个解决方法怎么样?虽然我不确定这对你的情况是否有用,你可以试试这个吗?此变通方法的流程如下。

流程:

  1. 将“材料”复制到目标工作表。
  2. 将“Calculations”复制到目标工作表作为“Calculations_temp”的名称。
  3. 将“Calculations_temp”的数据复制到“Calculations”。
  4. 删除“Calculations_temp”。

确认:

  • 在我的环境中,我确认SpreadsheetApp.flush() 不能用于这种情况。
  • 在您的问题中,I tried copying the formulas and pasting them back via Apps-Script, but it didn't work.
    • 确认公式不起作用,即使它复制了同一张表的范围。

因此,通过使用复制的“Calculations_temp”覆盖“Calculations”表,我尝试更新公式。

示例脚本:

var srcId = "#####"; // File ID of "Materials"
var dstId = "#####"; // File ID of "Calculations"
var src = SpreadsheetApp.openById(srcId).getSheetByName("Materials");
var dstSheet = SpreadsheetApp.openById(dstId);

// Copy "Materials" to destination sheet.
src.copyTo(dstSheet).setName("Materials");

// Copy "Calculations" to destination sheet as the name of "Calculations_temp".
dstSheet.getSheetByName("Calculations").copyTo(dstSheet).setName("Calculations_temp");

// Copy data of "Calculations_temp" to "Calculations".
//  var range = dstSheet.getSheetByName("Calculations").getDataRange(); // I confirmed that this didn't work.
var range = dstSheet.getSheetByName("Calculations_temp").getDataRange();
range.copyTo(dstSheet.getSheetByName("Calculations").getDataRange());

// Delete "Calculations_temp".
dstSheet.deleteSheet(dstSheet.getSheetByName("Calculations_temp"));

注意:

  • 使用时,请输入“Materials”和“Calculations”的文件ID。

如果这对你没有用,我很抱歉。

【讨论】:

  • 感谢您的帮助。实际上,除了引用材料表的“计算”之外,还有更多的表,因此重新创建这些表不是一个可行的选择。我试图从电子表格 B 中的空白“材料”表开始,在其中复制/粘贴电子表格 B 中的“材料”数据。如果可行,我会更新。
  • @J.如果这对你没有用,我真的很抱歉。
  • 不用担心。在预先存在的选项卡中复制/粘贴数据似乎对我有用。
猜你喜欢
  • 2012-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-10
  • 2014-09-26
  • 1970-01-01
  • 2020-06-17
  • 2010-10-30
相关资源
最近更新 更多