簡體   English   中英

Google Apps腳本-從電子表格創建PDf會生成Google登錄頁面的pdf

[英]Google Apps Script - Create PDf from Spreadsheet produces pdf of Google sign in page

需要一些幫助,有些困惑!

我已經為電子表格編寫了一個Google Apps腳本,可以從自定義菜單訪問該腳本,該腳本應創建電子表格頁面的pdf,並將其保存在我的google驅動器中。 該代碼執行確定並創建了pdf,但是我得到的只是Google登錄頁(用於表格)的pdf。 我是電子表格和驅動器文件夾的所有者,並且在我的Google Apps for Education帳戶中工作。 如果我在瀏覽器中嘗試完整的URL(theurl),則會得到我想要的pdf,這樣就可以正常工作,因此一定與blob或授權有關,但我看不出為什么嗎? 我一定想念一些明顯的東西。 我已經嘗試了一些我看到的授權代碼塊,但是這些只是凍結了腳本。 任何幫助大增。 蒂姆

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

}

代替使用UrlFetchApp.fetch() ,您可以使用DriveApp類獲得對該文件的引用

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(String)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM