将参考表复制到当前电子表格时如何更新工作表中的公式

时间:2018-03-14 23:13:09

标签: google-apps-script google-sheets

我有两张电子表格,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表在内部使用一些引用ID引用的,而不是它的名称。如何以编程方式更新内部参考?

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

1 个答案:

答案 0 :(得分:0)

这个解决方法怎么样?虽然我不确定这对你的情况是否有用,你能尝试一下吗?此解决方法的流程如下:

流程:

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

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

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

    示例脚本:

    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"));
    

    注意:

    • 使用时,请输入“材料”和“计算”的文件ID。

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