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

3

需要帮忙,我有些困惑!

我为电子表格编写了一个Google Apps脚本,从自定义菜单访问,应该创建电子表格页面的pdf,并将其保存在我的Google驱动器中。代码执行正常,生成了一个pdf,但是我得到的只是一个Google登录页面的pdf(用于表格)。我是电子表格和驱动器文件夹的所有者,并在我的Google教育应用程序中工作。如果我在浏览器中尝试全URL(theurl),我会得到我想要的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);

}
3个回答

5

不必使用UrlFetchApp.fetch(),你可以使用DriveApp类获取文件引用。

谷歌 DriveApp 类

使用这种方法的问题是,我不知道除了在保存 Sheet 之前进行格式化之外,如何将 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);

};

当我使用 fetch 方法时,如何获取所有创建变量? - Metric Rat
我不知道用我提供的代码如何实现那个。这是该选项的缺点。你可能需要一个模板电子表格,将数据转移到其中,然后从模板创建PDF。 - Alan Wells

1
感谢两位,也感谢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);

    }

必须去阅读一些关于这个的内容!


0

那我该怎么办呢?我已经按照其他人似乎成功使用过的代码进行了操作,但对我来说却不起作用。 - Metric Rat
urlFetch方法只有在以下情况下才能正常工作:1)电子表格是公共的;2)您提供了适当的oauth2参数,如accessToken。我看到其他的s.o. qas已经涵盖了如何做到这一点。 - Zig Mandel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接