簡體   English   中英

Google Apps 腳本:僅復制和粘貼公式

[英]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.

 
粵ICP備18138465號  © 2020-2025 STACKOOM.COM