Google Apps 脚本 - 从表格更新 PDF 并保留共享链接和权限

问题描述 投票:0回答:1

我有一个 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());
  }
}
google-sheets google-apps-script google-drive-api
1个回答
0
投票

我相信您的目标如下。

  • 您想要更新现有的 PDF 文件,而不是使用 Google Apps 脚本创建新的 PDF 文件。

这种情况下,使用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';
    的文件不存在时,创建一个新文件。
参考:

  • 方法:Drive API v3的files.update
© www.soinside.com 2019 - 2024. All rights reserved.