[英]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);
未聲明。copyTo
方法不能用於其他 Google 電子表格。 這似乎是當前的規范。 我認為這可能是您的問題的原因。sourceRange.getSheet().copyTo(destSS)
時,由於授權,無法顯示值。 我也很擔心這個。當以上幾點反映到您的腳本時,它變成如下。
在使用此腳本之前,請設置sourceID
、 sheetName
和newID
的變量。 並且,請將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.