使用 Range.getFormula() 时在电子表格中保留相对引用

Preserve relative references in spreadsheet when using Range.getFormula()

所以,我是 google script/javascript 的新手,我想知道如何从一个单元格中获取公式并将其应用于第二个单元格。原始公式引用了第三个单元格,所以我希望粘贴的单元格有一个新公式,其中引用单元格是相对于新定位的。 (就像我在电子表格 GUI 上使用复制和粘贴一样。)

function myFunction() {
  //Set Spreadsheet "Form Responses 1"
     var ss1 = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0];

  //Set Spreadsheet "Gant"
    var ss3 = SpreadsheetApp.getActiveSpreadsheet().getSheets()[1];

  //Get Last row with value
    var InputRange = ss1.getRange("A1:A").getValues();
    var InputLast = InputRange.filter(String).length;

  //Get Formula which is to be applied to last form entry
    var sourcerange = ss1.getRange(1, 12, 1, 3);
    var sourceformula = sourcerange.getFormula();

    var outputrange = ss1.getRange(1,12,1,3).offset(InputLast - 1, 0);
    outputrange.setFormula(sourceformula);
}

所以如果原始公式是

 =vlookup(A1, B;C,2,false)

新单元格应该类似于

 =vlookup(A4, B;C,2,false)    

我发现 .copyTo() 可以解决这个问题

如果有人想知道,这里是 link:https://developers.google.com/apps-script/reference/spreadsheet/range#copyTo(Range)

.copyTo() 适用于 OP 情况。但是如果你正在循环你可能想要的范围:

var sourceFormulas = sourceRange.getFormulasR1C1();

...

outputRange.setFormulasR1C1(sourceFormulas);

这样你只需要调用两次API;一次在循环之前,一次之后。它 比调用 API .copyTo() 每次循环迭代快 很多。