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

时间:2015-04-15 09:36:51

标签: google-apps-script google-sheets

所以,我是google脚本/ 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)    

2 个答案:

答案 0 :(得分:1)

我发现.copyTo()就是解决这个问题的原因

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

答案 1 :(得分:0)

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

var sourceFormulas = sourceRange.getFormulasR1C1();

...

outputRange.setFormulasR1C1(sourceFormulas);

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