[英]Google Apps Script: Copy and Paste Formulas Only
我只需要使用 Google Apps 腳本在電子表格中復制和粘貼公式
var range = activeSheet.getRange(targetRow-1, 1, 1, activeSheet.getLastColumn());
range.copyTo(activeSheet.getRange(targetRow, 1, 1, activeSheet.getLastColumn()), {contentsOnly:false});
這給了我完整的信息,包括公式和數據。 但是,我只想復制公式(沒有數據)。
CopyFormulasToRange
不幸的是不存在。
使用 getFormulasR1C1 和 setFormulasR1C1 復制公式並保留相對引用。 例如:
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
var currentRow = sheet.getLastRow();
var sourceRange = sheet.getRange(currentRow, 3, 1, 4);
var sourceFormulas = sourceRange.getFormulasR1C1();
currentRow++;
var targetRange = sheet.getRange(currentRow, 3, 1, 4);
targetRange.setFormulasR1C1(sourceFormulas);
https://developers.google.com/apps-script/reference/spreadsheet/range#getformular1c1 https://developers.google.com/apps-script/reference/spreadsheet/range#setformulasr1c1formulas
以下函數將僅復制公式。 它具有用於開始獲取公式的行和列的用戶設置。
function copyFormulas() {
var activeSheet,numberOfSourceColumnsToGet,sourceColumnStart,sourceFormulas,sourceRange,
sourceRowStart,targetColumn,targetRange,targetRowStart;
//USER INPUT
sourceRowStart = 1; //Row to start getting formulas from
sourceColumnStart = 2; //Column to start getting formulas from
numberOfSourceColumnsToGet = 1; //Number of columns to get formulas from
targetRowStart = 1; //Row to start copying formulas to
targetColumn = 3; //Column to start copying formulas to
//END OF USER INPUT
activeSheet = SpreadsheetApp.getActiveSheet();
sourceRange = activeSheet.getRange(sourceRowStart, sourceColumnStart, activeSheet.getLastRow(), numberOfSourceColumnsToGet);
sourceFormulas = sourceRange.getFormulas();//Get only formulas from the source range
targetRange = activeSheet.getRange(targetRowStart,targetColumn,sourceFormulas.length,sourceFormulas[0].length);
targetRange.setFormulas(sourceFormulas);//Copy the formulas to the target range
}
我在試圖弄清楚如何將公式從一行復制到另一行時發現了這個問題。 這是向電子表格添加一行以添加另一個數據集的非常常見的模式,其中每個數據集是一行,並且該行中的一些列是計算值。 您希望所有復制的公式都引用新行中的值,而不是復制公式的行。
@AllenWell 的答案復制了公式,但至少對我而言,不會將單元格引用更新為新行中的引用單元格。 使用他的代碼,復制的公式仍然引用從中復制公式的行。 從那以后,我了解到這里的秘密是使用get/setFormulasR1C1
而不是get/setFormulas
,因為后者使用相對引用,以便公式引用它們所在行中的值。
@MarkBird 的答案使用get/setFormulasR1C1
但對我不起作用。 它似乎在新行的每個單元格中都放了一些東西,因為即使對於不包含公式的列,它也會進行復制。 這搞砸了我的邏輯,我有將結果放在多列中的公式,但前提是它們是空白的。 他的代碼在更簡單的情況下可以正常工作,但如果它只復制公式會更好。 這就是我的解決方案所做的。
我寫了一個更復雜的 function ,它只復制公式,使公式引用新行中的值。 我抓取所有公式,然后有選擇地將它們復制到新行,跳過公式列表中的空白點。 這給了我想要的行為,我認為大多數人想要在電子表格中創建新行時想要什么。 這是執行此操作的 function。 它需要一個工作Sheet
引用以及源行和目標行的索引:
function copyFormulas(sheet, sourceRow, targetRow) {
var formulas = sheet.getRange(sourceRow, 1, 1, sheet.getLastColumn()).getFormulasR1C1()[0];
for (var i = 0; i < formulas.length; i++) {
if (formulas[i] !== '') {
sheet.getRange(targetRow, i + 1).setFormulaR1C1(formulas[i]);
}
}
}
注意公式是否為空的測試。 我認為這是@MarkBird 更簡單的解決方案所缺少的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.