谷歌应用程序脚本-从电子表格创建PDf生成谷歌登录页面的PDf



需要帮助,我有点困惑!

我已经为电子表格编写了一个谷歌应用程序脚本,可以从自定义菜单访问,该脚本应该创建电子表格页面的pdf,并将其保存在我的谷歌驱动器中。代码执行正常,创建了一个pdf,但我得到的只是一个谷歌登录页面的pdf(用于表单)。我是电子表格和驱动器文件夹的所有者,在我的谷歌教育应用程序帐户中工作。如果我在浏览器中尝试完整的url(url),我会得到我想要的pdf,所以它可以正常工作,所以一定与blob或授权有关,但我不明白为什么?我一定错过了什么显而易见的东西。我已经尝试了一些我看到的授权代码块,但这些只是冻结了脚本。任何帮助都得到了很大的缓解。Tim

pdf输出订单见附件

这是我的代码:

function spreadsheetToPDF(){
  var key = '14vZzkfMj9XSk4pgbQc78s1pBmsakHABJk7_MSX6j7xs';  //docid
  var index = 0;  //sheet gid / number

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var ActiveSheet = ss.getSheetByName('Order Form');
  var timestamp = Utilities.formatDate(new Date(), "GMT", "yyyy-MM-dd'-'HHmm");
  var supp_name = ActiveSheet.getRange("C12").getValue();  //supplier
  var plainonum = ActiveSheet.getRange("C5").getValue();  //order number
  var onum = ('0000' + plainonum ).slice(-4);  //sets leading zeros to order number
  var description = ActiveSheet.getRange("C18").getValue();  //description
  var name = 'Order-' + onum +'-' + supp_name + '-' + description + '-' + timestamp + '.pdf';  //makes pdf filename
  SpreadsheetApp.flush();  //ensures everything on spreadsheet is "done"
  //make the pdf from the sheet
  var theurl = 'https://docs.google.com/a/mydomain.org/spreadsheets/d/'
  + key 
  + '/export?exportFormat=pdf&format=pdf'
  + '&size=A4'
  + '&portrait=true'
  + '&fitw=true'       // fit to width, false for actual size
  + '&sheetnames=false&printtitle=false&pagenumbers=false'
  + '&gridlines=false'
  + '&fzr=false'      // do not repeat frozen rows on each page
  + '&gid='
  + index;       //the sheet's Id
  var docurl = UrlFetchApp.fetch(theurl);
  var pdf = docurl.getBlob().setName(name).getAs('application/pdf');
  //save the pdf to the folder on drive
  try {
      folder = DocsList.getFolder('Orders');
    } 
  catch (e) {
       folder = DocsList.createFolder('Orders');
    }
  folder.createFile(pdf);
}

您可以使用DriveApp类获取对文件的引用,而不是使用UrlFetchApp.fetch()

Google DriveApp类

使用这种方法的问题是,除了在保存工作表之前对其进行格式化外,我不知道有什么方法可以将PDF文件放在一个页面上。

此外,DocsList类现在已被弃用。

也许可以试试这样的东西:

function createPDF() {
  var fileToUse = 'FileID';
  //Logger.log('fileToUse: ' + fileToUse);
  var templateFile = DriveApp.getFileById(fileToUse); 
  var theBlob = templateFile.getBlob().getAs('application/pdf');
  var folderID = folderToSaveTo;
  var folder = DriveApp.getFolderById(folderID);
  var newFile = folder.createFile(theBlob);
   //newFile.setSharing(DriveApp.Access.ANYONE, DriveApp.Permission.VIEW);
};

感谢双方,也感谢Zig为我指明了正确的方向。经过一番挖掘,我在labnol.org上找到了一个脚本——做了一些完全不同的事情,但显示了oAuth授权部分。

我需要一个新的可变

var token = ScriptApp.getOAuthToken();

然后向docurl变量添加更多代码

var docurl = UrlFetchApp.fetch(theurl, { headers: { 'Authorization': 'Bearer ' +  token } }); 

这为电子表格不公开时提供了所需的授权。

工作功能:

    function spreadsheetToPDF(){
      var key = '14vZzkfMj9XSk4pgbQc78s1pBmsakHABJk7_MSX6j7xs';  //docid
      var index = 0;  //sheet gid / number

      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var ActiveSheet = ss.getSheetByName('Order Form');
      var timestamp = Utilities.formatDate(new Date(), "GMT", "yyyy-MM-dd'-'HHmm");
      var supp_name = ActiveSheet.getRange("C12").getValue();  //supplier
      var plainonum = ActiveSheet.getRange("C5").getValue();  //order number
      var onum = ('0000' + plainonum ).slice(-4);  //sets leading zeros to order number
      var description = ActiveSheet.getRange("C18").getValue();  //description
      var name = 'Order-' + onum +'-' + supp_name + '-' + description + '-' + timestamp + '.pdf';  //makes pdf filename
      SpreadsheetApp.flush();  //ensures everything on spreadsheet is "done"
      //make the pdf from the sheet
      var theurl = 'https://docs.google.com/a/mydomain.org/spreadsheets/d/'
      + key 
      + '/export?exportFormat=pdf&format=pdf'
      + '&size=A4'
      + '&portrait=true'
      + '&fitw=true'       // fit to width, false for actual size
      + '&sheetnames=false&printtitle=false&pagenumbers=false'
      + '&gridlines=false'
      + '&fzr=false'      // do not repeat frozen rows on each page
      + '&gid='
      + index;       //the sheet's Id
      var token = ScriptApp.getOAuthToken();
      var docurl = UrlFetchApp.fetch(theurl, { headers: { 'Authorization': 'Bearer ' +  token } });
      var pdf = docurl.getBlob().setName(name).getAs('application/pdf');
      //save the file to folder on Drive
  var fid = '0B1quMlsbdFZyfkZRaWFQZVZLdFNDcC1hZGVqM25NNDhZblhVZktjamJLTVBXRXk5aThtcXc';
  var folder = DriveApp.getFolderById(fid);
  folder.createFile(pdf);
    }

一定要去读一读这件事!

您所看到的是经过设计的。您正试图绕过用户验证。如果你查看文档,你会发现getAs。https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet#getAs(字符串)

最新更新