我有一个 Apps 脚本,可以将 Google 电子表格打印为 PDF 并将其保存在我的驱动器上。该脚本对此非常有效。挑战在于我想替换驱动器上的现有文件,保持共享链接完好无损,并保留权限,以便任何拥有该链接的人都可以访问更新的文件。下面是我的代码。我该如何调整它,以便它能够就地更新文件,而不是删除旧文件并创建新文件?
function savePDF() {
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var sheet = spreadsheet.getSheetByName('sheet_name'); // Specifically target the PDF_AVAIL_TOOL sheet
var folderId = 'my_google_drive_folder_id';
var pdfName = 'filename.pdf';
// Determine the last non-empty cell in each column and row
var dataRange = sheet.getDataRange();
var lastRow = dataRange.getLastRow();
var lastColumn = dataRange.getLastColumn();
// Adjust print settings to fit the data range
var range = sheet.getRange(1, 1, lastRow, lastColumn);
sheet.setActiveRange(range);
spreadsheet.setActiveSheet(sheet, true);
var folder = DriveApp.getFolderById(folderId);
var files = folder.getFilesByName(pdfName);
// Delete the existing PDF in the folder
while (files.hasNext()) {
var file = files.next();
folder.removeFile(file);
}
// Define PDF export URL with adjusted print range
var url = 'https://docs.google.com/spreadsheets/d/' + spreadsheet.getId() + '/export?exportFormat=pdf&format=pdf';
var options = '&size=letter' +
'&portrait=true' +
'&scale=2' +
'&top_margin=0.25' + '&bottom_margin=0.75' + '&left_margin=0.25' + '&right_margin=0.25' +
'&sheetnames=false&printtitle=false&pagenumbers=true&gridlines=false&fzr=true' +
'&gid=' + sheet.getSheetId(); // Using the specific Sheet ID for exporting
var token = ScriptApp.getOAuthToken();
// Fetch the PDF
var response = UrlFetchApp.fetch(url + options, {
headers: {
'Authorization': 'Bearer ' + token
}
});
// Convert to a blob and create new file in the drive folder
var blob = response.getBlob().setName(pdfName);
folder.createFile(blob);
// Log a success message
Logger.log('PDF updated and view permissions set in Google Drive folder!');
}
我也尝试了下面的代码,但是下面的代码生成了损坏的 PDF。
function updatePDF() {
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var sheet = spreadsheet.getSheetByName('PDF_AVAIL_TOOL'); // Target specific sheet
var folderId = '17kuKOJApfPvN7vHPygLAfKkVKis6Xhfr';
var pdfName = 'avail_inventory.pdf';
var folder = DriveApp.getFolderById(folderId);
var files = folder.getFilesByName(pdfName);
var existingFile = files.hasNext() ? files.next() : null;
var url = 'https://docs.google.com/spreadsheets/d/' + spreadsheet.getId() + '/export?exportFormat=pdf&format=pdf';
var options = '&size=letter' +
'&portrait=true' +
'&scale=2' +
'&top_margin=0.25' + '&bottom_margin=0.75' + '&left_margin=0.25' + '&right_margin=0.25' +
'&sheetnames=false&printtitle=false&pagenumbers=true&gridlines=false&fzr=true' +
'&gid=' + sheet.getSheetId(); // Using the specific Sheet ID for exporting
var token = ScriptApp.getOAuthToken();
var headers = {
'Authorization': 'Bearer ' + token,
'muteHttpExceptions': true
};
var response = UrlFetchApp.fetch(url + options, { headers: headers });
if (response.getResponseCode() == 200) {
var blob = response.getBlob().setName(pdfName);
// Create a new file and capture its ID
var newFile = folder.createFile(blob);
newFile.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.VIEW);
// Delete the old file if it exists
if (existingFile) {
existingFile.setTrashed(true);
}
Logger.log('PDF updated successfully and permissions are set.');
} else {
Logger.log('Failed to fetch the PDF: ' + response.getContentText());
}
}
我相信您的目标如下。
这种情况下,使用Drive API怎么样?当这反映在你的底部脚本中时,它会变成如下所示。
在使用此脚本之前,请在高级 Google 服务中启用 Drive API v3。
function updatePDF() {
var folderId = '17kuKOJApfPvN7vHPygLAfKkVKis6Xhfr';
var pdfName = 'avail_inventory.pdf';
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var sheet = spreadsheet.getSheetByName('PDF_AVAIL_TOOL');
var folder = DriveApp.getFolderById(folderId);
var files = folder.getFilesByName(pdfName);
var existingFileId = files.hasNext() ? files.next().getId() : Drive.Files.create({ name: pdfName, mimeType: MimeType.PDF, parents: [folderId] }).id;
var url = 'https://docs.google.com/spreadsheets/d/' + spreadsheet.getId() + '/export?exportFormat=pdf&format=pdf';
var options = '&size=letter' +
'&portrait=true' +
'&scale=2' +
'&top_margin=0.25' + '&bottom_margin=0.75' + '&left_margin=0.25' + '&right_margin=0.25' +
'&sheetnames=false&printtitle=false&pagenumbers=true&gridlines=false&fzr=true' +
'&gid=' + sheet.getSheetId(); // Using the specific Sheet ID for exporting
var token = ScriptApp.getOAuthToken();
var headers = {
'Authorization': 'Bearer ' + token,
'muteHttpExceptions': true
};
var response = UrlFetchApp.fetch(url + options, { headers: headers });
if (response.getResponseCode() == 200) {
var blob = response.getBlob().setName(pdfName);
Drive.Files.update({}, existingFileId, blob);
DriveApp.getFileById(existingFileId).setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.VIEW);
Logger.log('PDF updated successfully and permissions are set.');
} else {
Logger.log('Failed to fetch the PDF: ' + response.getContentText());
}
}
var pdfName = 'avail_inventory.pdf';
的文件存在时,会更新现有文件。当
var pdfName = 'avail_inventory.pdf';
的文件不存在时,创建一个新文件。