【问题标题】:Google App Script - Save Spreadsheet to PDF saved on Google DriveGoogle App Script - 将电子表格保存为保存在 Google Drive 上的 PDF
【发布时间】:2020-09-10 16:55:32
【问题描述】:

我正在尝试将我的电子表格中的所有工作表作为一个 PDF 保存到谷歌驱动器(最终我希望他们也能通过电子邮件发送)。我无法保存不止一张床单。我已经尝试了多种方法。下面的代码是迄今为止我发现的最好的方法。问题再次是它只将第一页保存为 PDF,我不知道如何绕过删除多余的工作表。我看到的所有帖子都只想保存一页,我有超过 24 页需要保存为一个 PDF。提前感谢您的帮助!

function PDF() {
  var sheetName = SpreadsheetApp.getActiveSpreadsheet();
  var folderID = "*** Google Drive ID***"; // Folder id to save in a Drive folder.
  var ss = SpreadsheetApp.openByUrl(
     'https://docs.google.com/spreadsheets/d/***Spreadsheet ID***'); 
  var pdfName = "MAR -  " + ss.getRange("A1:A1").getValue(); //Need to set the values to another sheet

  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);

  //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);
}

【问题讨论】:

    标签: pdf google-apps-script google-sheets


    【解决方案1】:

    通过使用 Drive API,您可以将电子表格转换为包含电子表格中所有工作表的 PDF。为了使用它,请在 Google API Console 上启用 Drive API,如下所示。

    1. 在脚本编辑器中,选择资源 > 云平台项目

    2. 在对话框底部,单击 Google API 控制台的链接。

    3. 在控制台中,单击过滤器框并输入 API 的部分名称“Drive API”,然后在看到名称后单击该名称。

    4. 在下一个屏幕上,点击启用 API。

    5. 关闭开发者控制台并返回脚本编辑器。在对话框中单击“确定”。

    我准备了一个示例脚本,用于从电子表格创建 PDF 文件。请将此用于您的脚本。

    脚本:

    var spreadsheetId = "#####";
    var folderId = "#####";
    var outputFilename = "#####";
    
    var url = "https://www.googleapis.com/drive/v3/files/" + spreadsheetId + "/export?mimeType=application/pdf";
    var options = {
        method: "GET",
        headers: {Authorization: "Bearer " + ScriptApp.getOAuthToken()},
        muteHttpExceptions: true
    };
    var response = UrlFetchApp.fetch(url, options).getBlob();
    DriveApp.getFolderById(folderId).createFile(response).setName(outputFilename);
    

    关于这个脚本,虽然我确认它可以正常工作,但如果它在您的环境中不起作用,请告诉我。如果我误解了你的问题,我很抱歉。

    添加了 1 个:

    function PDF() {
      var sheetName = SpreadsheetApp.getActiveSpreadsheet();
      var folderID = "*** Google Drive ID***"; // Folder id to save in a Drive folder.
      var ss = SpreadsheetApp.openByUrl(
         'https://docs.google.com/spreadsheets/d/***Spreadsheet ID***'); 
      var pdfName = "MAR -  " + ss.getRange("A1:A1").getValue(); //Need to set the values to another sheet
    
      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);
    
      //save to pdf
    //  var theBlob = destSpreadsheet.getBlob().getAs('application/pdf').setName(pdfName);
    //  var newFile = folder.createFile(theBlob);
    
    
      // A sample script was added here.
      var url = "https://www.googleapis.com/drive/v3/files/" + destSpreadsheet.getId() + "/export?mimeType=application/pdf";
      var options = {
          method: "GET",
          headers: {Authorization: "Bearer " + ScriptApp.getOAuthToken()},
          muteHttpExceptions: true
      };
      var response = UrlFetchApp.fetch(url, options).getBlob();
      DriveApp.getFolderById(folderID).createFile(response).setName(pdfName);
    
    
      //Delete the temporary sheet
      DriveApp.getFileById(destSpreadsheet.getId()).setTrashed(true);
    }
    

    添加了 2 个:

    function PDF() {
      var folderID = "*** Google Drive ID***"; // Folder id to save in a Drive folder.
      var ss = SpreadsheetApp.openByUrl(
         'https://docs.google.com/spreadsheets/d/***Spreadsheet ID***'); 
      var pdfName = "MAR -  " + ss.getRange("A1:A1").getValue(); //Need to set the values to another sheet
      var sourceSpreadsheet = SpreadsheetApp.getActive();
      var folder = DriveApp.getFolderById(folderID);
    
      // A sample script was added here.
      var url = "https://www.googleapis.com/drive/v3/files/" + sourceSpreadsheet.getId() + "/export?mimeType=application/pdf";
      var options = {
          method: "GET",
          headers: {Authorization: "Bearer " + ScriptApp.getOAuthToken()},
          muteHttpExceptions: true
      };
      var response = UrlFetchApp.fetch(url, options).getBlob();
      DriveApp.getFolderById(folderID).createFile(response).setName(pdfName);
    }
    

    【讨论】:

    • 我在脚本的什么地方添加这个?
    • 我很抱歉我的回答很糟糕。我更新了我的答案并添加了一个脚本,将您的脚本修改为“已添加”。请检查一下。
    • 我试过了,但我一直收到同样的错误,您无法删除文档中的最后一张纸。 (第 19 行,文件“PDF Stack”)解雇
    • 我不知道第 19 行。它是否出现在我的脚本中?
    • 不,它不会出现在您的脚本中,也非常感谢您的帮助!
    【解决方案2】:

    这是从谷歌表格创建 PDF 文件的函数,以及将新创建的文件移动到您为函数参数提供的 id 的文件夹中的函数。

    function downloadPDF(fileId, folderId) {
      var file = Drive.Files.get(fileId);
      var url = file.exportLinks[MimeType.PDF];
    
      var options = {
        headers: {
          Authorization:"Bearer " + ScriptApp.getOAuthToken()
        },
        muteHttpExceptions : true 
      }
    
      var response = UrlFetchApp.fetch(url, options);
      var status = response.getResponseCode();
      var result = response.getContentText();
      if (status != 200) {
        // Get additional error message info, depending on format
        if (result.toUpperCase().indexOf("<HTML") !== -1) {
          var message = strip_tags(result);
        }
        else if (result.indexOf('errors') != -1) {
          message = JSON.parse(result).error.message;
        }
        throw new Error('Error (' + status + ") " + message );
      }
    
      var doc = response.getBlob();
      var newFileid = DriveApp.createFile(doc).setName(file.title + '.pdf').getId();
      let id = moveFileTo(newFileid, folderId);
     
      return id;
    }
    
    
    function moveFileTo(sourceId, folderId){
      let file = DriveApp.getFileById(sourceId)
      let blob = file.getBlob();
      let id = DriveApp.getFolderById(folderId).createFile(blob).getId();
          file.setTrashed(true)
          return id;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-21
      相关资源
      最近更新 更多