google-apps-script - 保存文件时如何用应用脚本覆盖旧文件?
问题描述
我在谷歌表中有几页。我使用以下代码从这些页面获取 Sheet2 的 PDF 输出。当 pdf 打印出来时,它会删除旧的 pdf 打印输出并创建一个新的。发生这种情况时,pdf 的链接会更改。我不想改变 pdf 的链接。当它创建新的pdf时,我希望它覆盖旧的。我该怎么做呢?
function checkSheet() {
var sheetName = "Sheet2";
var folderID = "folderid"; // Folder id to save in a folder.
var pdfName = "Catalog";
var sourceSpreadsheet = SpreadsheetApp.getActive();
var sourceSheet = sourceSpreadsheet.getSheetByName(sheetName);
var folder = DriveApp.getFolderById(folderID);
//Copy whole spreadsheet
var destSpreadsheet = SpreadsheetApp.open(DriveApp.getFileById(sourceSpreadsheet.getId()).makeCopy("tmp_convert_to_pdf", folder))
//delete redundant sheets
var sheets = destSpreadsheet.getSheets();
for (i = 0; i < sheets.length; i++) {
if (sheets[i].getSheetName() != sheetName){
destSpreadsheet.deleteSheet(sheets[i]);
}
}
var destSheet = destSpreadsheet.getSheets()[0];
//repace cell values with text (to avoid broken references)
var sourceRange = sourceSheet.getRange(1,1,sourceSheet.getMaxRows(),sourceSheet.getMaxColumns());
var sourcevalues = sourceRange.getValues();
var destRange = destSheet.getRange(1, 1, destSheet.getMaxRows(), destSheet.getMaxColumns());
destRange.setValues(sourcevalues);
//delete old pdf
var files = DriveApp.getFolderById(folderID).getFiles();
while (files.hasNext()) {
var file = files.next();
if(file.getName() == "Catalog"){
DriveApp.getFileById(file.getId()).setTrashed(true);
}
}
//save to pdf
var theBlob = destSpreadsheet.getBlob().getAs('application/pdf').setName(pdfName);
var newFile = folder.createFile(theBlob);
//Delete the temporary sheet
DriveApp.getFileById(destSpreadsheet.getId()).setTrashed(true);
}
解决方案
您的问题包含很多不必要的细节。我相信它可以简化为“如何更新 Google Drive 上现有的 PDF 文件?”
为此,您必须启用Advanced Drive Service,该服务具有更新方法,可以替换 Google Drive 中现有的 PDF 文件。
function replaceFile(theBlob,theFileId) {
var oldFile = DriveApp.getFileById(theFileId);
Drive.Files.update({title: oldFile.getName(),mimeType:
oldFile.getMimeType()}, theFileId, theBlob);
}
}
推荐阅读
- python - 熊猫根据时间戳合并
- python - 如何在熊猫中按天和月分组?
- swiftui - 以非模态方式呈现视图
- bash - 如何在 bash 脚本中的远程服务器上使用 SSH 运行多个命令?
- c++ - Visual Studio 测试资源管理器找不到我的 Boost 测试
- r - 查找没有包的 1:n 数字的所有唯一组合
- react-native - 尝试升级 React Native,得到令人困惑的信息
- spring - 一堆更改后如何解决 UnsatisfiedDependencyException
- gradle - 如何为 Netbeans 启用 gradle?
- hyperledger-fabric - 我们能否在生产中从基于 kafta 的订购服务更改为基于 raft 的订购,反之亦然在 hyperledger 结构中?