【问题标题】:Exporting PDF to Drive Using Script使用脚本将 PDF 导出到驱动器
【发布时间】:2020-12-22 14:24:14
【问题描述】:

我正在尝试将 PDF 导出到我的驱动器。该脚本当前执行此操作。但是,我只希望导出特定范围的单元格,并且我希望保存文件的名称从工作表中的单元格中提取信息。请帮忙!我有以下脚本:

function getpdf2(){
SpreadsheetApp.flush();
   
      var theurl = 'https://docs.google.com/spreadsheets/d/'
      + '1C-ONDP4pZeUrlMYekvg0i8oNceASL1s4_o8oBpQuzHk'  
      + '/export?exportFormat=pdf&format=pdf'
      + '&size=LETTER'
      + '&portrait=false'
      + '&fitw=false'       
      + '&top_margin=0.50'              
      + '&bottom_margin=0.50'          
      + '&left_margin=0.50'             
      + '&right_margin=0.50'           
      + '&sheetnames=false&printtitle=false'
      + '&pagenum=false'
      + '&gridlines=false'
      + '&fzr=FALSE'      
      + '&gid='
      + '1101884643';       

      var token = ScriptApp.getOAuthToken();
      
      var docurl = UrlFetchApp.fetch(theurl, { headers: { 'Authorization': 'Bearer ' +  token } });
      var fileid = DriveApp.createFile(docurl.getBlob()).setName('CAITLYN!B7.pdf').getId();
      
      var pdf = docurl.getBlob().setName('CAITLYN!B7.pdf');
      var pdf = docurl.getBlob().getAs('application/pdf').setName('testss.pdf'); 
      var filetodel = DriveApp.getFileById(fileid);

      if (DriveApp.getFoldersByName("PDF Quotes").hasNext()){
      var folder = DriveApp.getFoldersByName("PDF Quotes").next();
      filetodel.makeCopy(folder);
       }
      DriveApp.removeFile(filetodel);
 }

【问题讨论】:

    标签: google-apps-script


    【解决方案1】:

    由于没有导出特定范围的本地方法,我们需要访问电子表格中的数据。

    为了简化导出过程,我们需要将数据范围复制到临时工作表中,然后将其粘贴到第一组单元格中。

    之后,我们需要将复制的单元格之外的单元格隐藏起来。

    最后,我们将该临时工作表导出为驱动器中的 pdf。

    这是完整的工作代码。

    function exportRangeToPdf() {
      // Get the sheet id, sheet name, range of cells you want to export 
      // and the folder ID in your drive where you want to store the pdf
      var sheetId = '1ZzkBAR1EgismFCd-hxOUyC_uZKYucu7Av-lDHhrEMx4';
      var sheetName = 'Sheet1';
      var sheetSrcRange = 'B5:C6';
      var driveId = '0B55C21aJsSBlfk9FTjRqOG8tb3hjR1N4MTU1YjVPNU4weGVhSldfU3F4OXladVVNMF9Ccms';
    
      var sheet = SpreadsheetApp.openById(sheetId).getSheetByName(sheetName);
      var range = sheet.getRange(sheetSrcRange);
      var sheetDstRange = 'A1:' + sheet.getRange(range.getHeight(), range.getWidth()).getA1Notation();
      var rangeValues = range.getValues();
      var folder = DriveApp.getFolderById(driveId);
    
      // Feel free to modify if needed
      // From sheet name (e.g. Sheet1.pdf)
      var pdfName = sheetName + '.pdf';
      // From specific cell, can be inside or outside your selected range to export (e.g. exportedPDF.pdf)
      // var pdfName = sheet.getRange('C7').getValue() + '.pdf';
      // From the combination of sheet name and range you chose (e.g. Sheet1_B5:C6.pdf)
      // var pdfName = sheetName + '_' + sheetSrcRange + '.pdf';
      
      // Create a blank spreadsheet to be able to export just the range
      var destSpreadsheet = SpreadsheetApp.create('PDF');
      
      // If our range is 2 rows and 2 columns we want it to be copied from A1 to B2
      // Then we can hide the rest of columns and rows and export 
      var sheet2 = destSpreadsheet.getSheetByName('temp');
      if(!sheet2){
        destSpreadsheet.insertSheet('temp').getRange(sheetDstRange).setValues(rangeValues);
        var sheet2 = destSpreadsheet.getSheetByName('temp');
      }
      
      // Hide all the rows and columns that do not have content 
      sheet2.hideRows(sheet2.getLastRow() + 1, sheet2.getMaxRows() - sheet2.getLastRow());
      sheet2.hideColumns(sheet2.getLastColumn() + 1, sheet2.getMaxColumns() - sheet2.getLastColumn());
      // Delete the first sheet that is automatically created when you create a new spreadsheet
      destSpreadsheet.deleteSheet(destSpreadsheet.getSheetByName(sheetName));
      
      // Export our new spreadsheet to PDF
      var theBlob = destSpreadsheet.getBlob().getAs('application/pdf').setName(pdfName);
      folder.createFile(theBlob);
      
      // Delete the spreadsheet we created to export this range. 
      DriveApp.getFileById(destSpreadsheet.getId()).setTrashed(true);
    }
    

    样本数据:

    输出:

    【讨论】:

    • 您知道我需要为 pdfName 使用什么代码才能使其成为特定单元格中的信息吗?
    • 你能举一个你想要的输出的例子吗? pdfName。你的意思是,如果工作表名称是Sheet1 并且范围是B5:D10pdfName 将是Sheet1_B5:D10.pdf?如果是这样,那么是的。如果您的意思是 pdfName 是从特定单元格中获取名称,那也是可能的。
    • @Caitlyn,我已经更新了上面的答案以显示导出的 pdf 名称的可能变化。
    • @Caitlyn,我能回答你的问题吗?如果您的问题得到解决,请按接受按钮。与您有相同问题的其他人也可以将您的问题作为可以解决的问题。如果找不到按钮,请随时告诉我。 stackoverflow.com/help/accepted-answer
    • 谢谢。是的
    【解决方案2】:

    我以不同的方式解决了同样的挑战,消除了代码并有效地为我工作。我没有编写脚本来创建选项卡、复制数据、删除我不想要的内容等。我只是创建了一个“导出”选项卡并使用查询来定期提取我想要导出的数据。

    就我而言,我想以不同的顺序导出列,因此我使用 arrayformula 将主数据选项卡中的各个列拉入一个数组,然后对其运行查询。请注意,我还在查询中过滤数据 ("Col7'Completed') 以仅拉入我想要的行。最后,您会看到过滤器引用 Col7 而不是列字母。当您使用 arrayformula 时,您必须按列在数组中的位置(Col1、Col2 等)引用列

    =query(ArrayFormula({'Primary Data Tab'!AJ:AJ,{'Primary Data Tab'!G:G}&" ""&{'Primary Data Tab'!I:I},'Primary Data Tab '!M:M,'主数据选项卡'!E:E,'主数据选项卡'!F:F,'主数据选项卡'!AK:AK,'主数据选项卡'!AI:AI,'主数据选项卡'!W:W,'主数据选项卡'!K:K,'主数据选项卡'!B:B,'主数据选项卡'!C:C,'主数据选项卡'!Y:Y}),"选择* where Col7'Completed' and Col7'Cancelled'",1)

    您可以通过引入整个工作表并使用查询来选择列并对其进行过滤来简化此操作: =query('Primary Data Tab'!A:AJ,"select A,B,D,G,T,AD where G'Completed' and G'Cancelled'",1)

    完成此操作后,选项卡中的数据会自动反映主数据选项卡,您可以随时将其导出。

    【讨论】:

      猜你喜欢
      • 2020-07-27
      • 1970-01-01
      • 1970-01-01
      • 2018-10-04
      • 1970-01-01
      • 1970-01-01
      • 2013-04-13
      • 1970-01-01
      • 2016-02-17
      相关资源
      最近更新 更多