使用 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() 每次循环迭代快 很多。
所以,我是 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() 每次循环迭代快 很多。