簡體   English   中英

將數據從一個電子表格復制到另一種保留格式且不使用公式

[英]Copy data from one Spreadsheet to another keeping format and without formulas

我要做的是將數據范圍從一個電子表格復制到另一個電子表格,同時保留格式(顏色、樣式等),並且只獲取沒有公式的值。

我已經有了這段代碼(來自@Tanaike 的先前回答),並進行了一些修改。 它保留格式但復制公式,我只需要值。

//Source
var sourceSheet = SpreadsheetApp.openById(sourceID).getSheetByName(sheetName);
var sourceRange = sourceSheet.getRange(range);

//Destination
var destSS = SpreadsheetApp.openById(newID);
var destSheet = destSS.getSheets()[0];
var destRange = destSheet.getRange(range);
destSheet.clear();

//var copiedsheet = sourceRange.getSheet().copyTo(destSS); // <-- This works, but copies formulas and get Ref errors
var copiedsheet = sourceRange.getSheet().copyTo(destRange, {contentsOnly: true}); //Doesn't work, I tried many variations of this

copiedsheet.getRange(sourceRange.getA1Notation()).copyTo(destRange, {contentsOnly: true});
copiedsheet.getRange(sourceRange.getA1Notation()).copyTo(destRange, SpreadsheetApp.CopyPasteType.PASTE_COLUMN_WIDTHS, false); // Will preserve formatting
destSS.deleteSheet(destSS.getSheets()[0]);

DriveApp.getFolderById(destFolder).addFile(docFile);
DriveApp.getRootFolder().removeFile(docFile);

修改點:

  • 在您的腳本中, var destRange = destSheet.getRange(range); range范圍var sourceRange = sourceSheet.getRange(range); 未聲明。
  • Class Range 中的copyTo方法不能用於其他 Google 電子表格。 這似乎是當前的規范。 我認為這可能是您的問題的原因。
  • 並且,例如,當在源表中使用IMPORTRANGE作為公式時,當使用sourceRange.getSheet().copyTo(destSS)時,由於授權,無法顯示值。 我也很擔心這個。

當以上幾點反映到您的腳本時,它變成如下。

修改后的腳本:

在使用此腳本之前,請設置sourceIDsheetNamenewID的變量。 並且,請將range設置為 A1Notation。

//Source
var sourceSS = SpreadsheetApp.openById(sourceID);
var sourceSheet = sourceSS.getSheetByName(sheetName);
var tempSheet = sourceSheet.copyTo(sourceSS);
var temoSheetRange = tempSheet.getRange(range);
temoSheetRange.copyTo(temoSheetRange, {contentsOnly: true});
SpreadsheetApp.flush(); // This might not be required.

//Destination
var destSS = SpreadsheetApp.openById(newID);
var destSheet = destSS.getSheets()[0];
destSheet.clear();
var destTempSheet = tempSheet.copyTo(destSS);
var destTempRange = destTempSheet.getRange(range);
var dstRange = destSheet.getRange("A1");
destTempRange.copyTo(dstRange);
destTempRange.copyTo(dstRange, SpreadsheetApp.CopyPasteType.PASTE_COLUMN_WIDTHS, false);
var i = 1;
var row = destTempRange.getRow();
for (var r = row; r <= row + destTempRange.getNumRows(); r++) {
  destSheet.setRowHeight(i++, destTempSheet.getRowHeight(r));
}
destSS.deleteSheet(destTempSheet);
sourceSS.deleteSheet(tempSheet);
  • 我不確定您的DriveApp.getFolderById(destFolder).addFile(docFile);方向DriveApp.getRootFolder().removeFile(docFile); 在你的腳本中。 所以在這個修改中,我沒有展示它。 當您需要使用它時,請添加它。

筆記:

  • 如果您只能復制除默認高度21像素之外的行高,則可能會降低腳本成本。 如果您使用它,請進行如下修改。 在此修改中,不使用表格 API。

    •  for (var r = row; r <= row + destTempRange.getNumRows(); r++) { destSheet.setRowHeight(i++, destTempSheet.getRowHeight(r)); }
    •  for (var r = row; r <= row + destTempRange.getNumRows(); r++) { var rowHeight = destTempSheet.getRowHeight(r); if (rowHeight.= 21) destSheet,setRowHeight(i; rowHeight); i++; }
  • 或者,當您使用 Sheets API 時,您也可以使用以下修改。 在這種情況下,請在 Google 高級服務中啟用表格 API。

    •  var i = 1; var row = destTempRange.getRow(); for (var r = row; r <= row + destTempRange.getNumRows(); r++) { destSheet.setRowHeight(i++, destTempSheet.getRowHeight(r)); }
    •  var reqs = []; var sheetId = destSheet.getSheetId(); var reqs = Sheets.Spreadsheets.get(newID, {ranges: [destTempSheet.getSheetName()], fields: "sheets(data(rowMetadata))"}).sheets[0].data[0].rowMetadata.reduce((ar, {pixelSize}, r) => { if (pixelSize.= 21) ar:push({updateDimensionProperties:{range:{sheetId,sheetId:dimension,"ROWS":startIndex,r:endIndex,r+1}:properties:{pixelSize,pixelSize}:fields;"pixelSize"}}); return ar, }; []). if (reqs.length > 0) Sheets.Spreadsheets:batchUpdate({requests, reqs}; newID);

參考:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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