这个解决方法怎么样?在此解决方法中,Sheets API 用于复制电子表格。对于 Class Spreadsheet 的 copy()、Class File 和 Files: copy of Drive API 的 makeCopy(),复制的电子表格包括绑定的脚本和链接的表单。所以我想到使用Sheets API。此解决方法的流程如下。
- 使用spreadsheets.get检索源电子表格的对象。
- 通过使用spreadsheets.create 包含检索到的对象来创建新的电子表格。
通过该流程,可以创建不包括绑定脚本和链接表单的复制电子表格。示例脚本如下。当您使用此脚本时,请在高级 Google 服务和 API 控制台中启用 Sheets API。您可以在以下位置查看如何启用 Sheets API:here https://stackoverflow.com/questions/48754286/retrieving-google-sheets-cell-border-style-programmatically/48756509#48756509.
示例脚本:
var fileId = "### fileId of source Spreadsheet ###"; // Please set here.
var obj = Sheets.Spreadsheets.get(fileId, {fields: "namedRanges,properties,sheets"});
Sheets.Spreadsheets.create(obj);
Note :
- 使用此脚本时,请设置源电子表格的fileId。
- 在Sheets API的spreadsheets.create中,无法在特定文件夹中创建电子表格。因此,复制的电子表格将创建到根文件夹中。如果您想在特定文件夹中创建它,请在复制电子表格后将其移动。当然,您可以使用脚本来完成。
- 如果你想包括
developerMetadata
电子表格,请将其添加到fields
.
参考 :
- 类电子表格的 copy() https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet#copy(String)
- 类文件的 makeCopy() https://developers.google.com/apps-script/reference/drive/file#makeCopy()
- 文件:Drive API 的副本 https://developers.google.com/drive/api/v3/reference/files/copy
- 方法:Sheets API的spreadsheets.get https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/get
- 方法:Sheets API的spreadsheets.create https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/create
更新日期:2023 年 7 月 7 日
当我再次测试上面的脚本时,在当前阶段,我发现它无法正确使用。因为,现阶段,智能芯片已经实现。在这种情况下,当前规范无法将 Sheets API 作为对象进行检索。因此,作为当前的示例脚本,我想添加它。我回答了这个问题这个线程 https://stackoverflow.com/q/76614461。此外,该脚本使用 Sheets API。因此,请在高级 Google 服务中启用 Sheets API。
使用此功能之前,请先设置spreadsheetId
.
const spreadsheetId = "###"; // Please set your Spreadsheet ID.
// Ref: https://tanaikech.github.io/2021/03/26/copying-protections-for-spreadsheet-using-google-apps-script/
function copyProtectedRanges_(srcId, dstId) {
const obj = Sheets.Spreadsheets.get(dstId, { fields: "sheets(properties(sheetId),protectedRanges(protectedRangeId))" }).sheets
.reduce((o, s) => {
o.sheetIds.push(s.properties.sheetId);
if (s.protectedRanges && s.protectedRanges.length > 0) {
s.protectedRanges.forEach(({ protectedRangeId }) => o.protectedRangeIds.push({ deleteProtectedRange: { protectedRangeId } }));
}
return o;
}, { sheetIds: [], protectedRangeIds: [] });
const requests = Sheets.Spreadsheets.get(srcId, { fields: "sheets/protectedRanges" }).sheets
.reduce((ar, s, i) => {
if (s.protectedRanges && s.protectedRanges.length > 0) {
const temp = s.protectedRanges.map(e => {
delete e.protectedRangeId;
e.range.sheetId = obj.sheetIds[i];
if (e.unprotectedRanges) {
e.unprotectedRanges.forEach(f => f.sheetId = obj.sheetIds[i]);
}
return { addProtectedRange: { protectedRange: e } };
});
ar = ar.concat(temp);
}
return ar;
}, obj.protectedRangeIds);
if (requests.length == 0) return;
Sheets.Spreadsheets.batchUpdate({ requests }, dstId);
}
// Please run this function.
function main() {
const srcSpreadsheet = SpreadsheetApp.openById(spreadsheetId);
const dstSpreadsheet = SpreadsheetApp.create(`Copied ${srcSpreadsheet.getName()}`);
const srcSSId = srcSpreadsheet.getId();
const dstSSId = dstSpreadsheet.getId();
DriveApp.getFileById(dstSSId).moveTo(DriveApp.getFileById(srcSSId).getParents().next());
const temp = dstSpreadsheet.getSheets()[0].setName(Utilities.getUuid());
srcSpreadsheet.getSheets().forEach(sheet => sheet.copyTo(dstSpreadsheet).setName(sheet.getName()));
dstSpreadsheet.deleteSheet(temp);
copyProtectedRanges_(srcSSId, dstSSId);
}