使用 google 应用程序脚本将电子表格制作成 pdf 但得到 html

using google app script to make spreadsheet into a pdf but getting html

我创建了一个新的传播sheet,其中一个 sheet 包含感兴趣的数据子集。我的脚本在原版传播sheet。在该代码中,我试图创建新价差 sheet 的 PDF。我的代码生成的 URL 是:

exportUrl=https://docs.google.com/spreadsheets/d/1M82johI78eIrEf8u9RV_5kPgCDAaSfOcoGVYAyno5gE/?usp=drivesdk/export?exportFormat=pdf&format=pdf&size=LETTER&portrait=true&fitw=true&top_margin=0.75 &bottom_margin=0.75&left_margin=0.7&right_margin=0.7&sheetnames=false&printtitle=false&pagenum=false&gridlines=true&fzr=FALSE

MyDrive 中生成的PDF 没有PDF 的图标。如果我预览它,我会看到:

<!DOCTYPE html><html lang="en"><head><script nonce="siOEWKm8X/lqnbWRNS06ow">var DOCS_timing={}; DOCS_timing['pls']=new Date().getTime();</script><meta property="og:title" content="tempSs"><meta property="og:type" content="article"><meta property="og:site_name" content="Google Docs"><meta property="og:url" content="https://docs.google.com/spreadsheets/d/1M82johI78eIrEf8u9RV_5kPgCDAaSfOcoGVYAyno5gE/edit?usp=drivesdk/export?exportFormat%3Dpdf&amp;format=pdf&amp;size=LETTER&amp;portrait=true&amp;fitw=true&amp;top_margin=0.75&amp;bottom_margin=0.75&amp;left_margin=0.7&amp;right_margin=0.7&amp;sheetnames=false&amp;printtitle=false&amp;pagenum=false&amp;gridlines=true&amp;fzr=FALSE&amp;usp=embed_facebook"><meta property="og:description" content="Sheet1

Abdalla,WilliamAbdalla
Aden,VickieAden
Allen,VeronicaAllen
etc.

当我下载它时,它的文件扩展名为 html。如果我打开它,数据就在那里,但是有很多 header 没有意义的东西。如果我将文件扩展名更改为 pdf,我会收到错误:无法加载 pdf

我的代码:

/**
 * based on https://xfanatical.com/blog/print-google-sheet-as-pdf-using-apps-script/
 */
function exportAsPDF() {
 fileName = “tempSs”;
 var ssId = getMostRecentFile(fileName);
 var ssBaseUrl = getMostRecentFile(fileName);
 var blob = _getAsBlob(ssBaseUrl);
 _exportBlob(blob, fileName);
}

/**
 * Assume multiple spreadsheets with same name
 * only want to use the most recent
 */
function getMostRecentFile(fileName) {
 ssIt = DriveApp.getFilesByName(fileName);
 var createDate, prevCreateDate, tempSsId;
  
 var result = [];
 while (ssIt.hasNext()) {
  var file = ssIt.next();
  result.push([file.getDateCreated(),file.getId(), file.getUrl()]);
 } 
 var dTime = result.sort()[0][0];
 var tempSsId = result.sort()[0][1];
 var ssBaseUrl = result.sort()[0][2];
// Logger.log(“tempSsId: ” + tempSsId + ” dTime: ” + dTime);

 return ssBaseUrl;
}

function _getAsBlob(ssUrlBase) {

// Logger.log(“ssUrlBase before remove edit: ” + ssUrlBase );
 var ssUrlBase = ssUrlBase.replace(/edit?/,”);
 Logger.log(“ssUrlBase: ” + ssUrlBase );

 var exportUrl = ssUrlBase
   + ‘/export?exportFormat=pdf&format=pdf’
   + ‘&size=LETTER’
   + ‘&portrait=true’
   + ‘&fitw=true’    
   + ‘&top_margin=0.75’        
   + ‘&bottom_margin=0.75’      
   + ‘&left_margin=0.7’       
   + ‘&right_margin=0.7’      
   + ‘&sheetnames=false&printtitle=false’
   + ‘&pagenum=false’
   + ‘&gridlines=true’
   + ‘&fzr=FALSE’;
    
 Logger.log(‘exportUrl=’ + exportUrl);
 var response = UrlFetchApp.fetch(exportUrl, {
  headers: { 
   Authorization: ‘Bearer ‘ + ScriptApp.getOAuthToken(),
  },
 })
  
 return response.getBlob();
}

为什么我在 MyDrive 中或下载时没有获得有效的 PDF?感谢大家。如果不经常使用 Whosebug 上的好答案,我就不会走到这一步。

修改点:

  • 当我看到exportUrl=https://docs.google.com/spreadsheets/d/1M82johI78eIrEf8u9RV_5kPgCDAaSfOcoGVYAyno5gE/?usp=drivesdk/export?exportFormat=pdf&format=pdf&size=LETTER&portrait=true&fitw=true&top_margin=0.75&bottom_margin=0.75&left_margin=0.7&right_margin=0.7&sheetnames=false&printtitle=false&pagenum=false&gridlines=true&fzr=FALSE的URL时。我注意到修改点。
    • 我认为/?usp=drivesdk/export?是修改点。请修改为/export?。我认为这就是您遇到问题的原因。
  • 并且,在你的脚本中,需要修改双引号和单引号的字体。在您的脚本中,请将 修改为 ",将 修改为 '

当以上几点反映到你的脚本中,就变成了下面这样。

修改后的脚本:

function exportAsPDF() {
  fileName = "tempSs";
//   var ssId = getMostRecentFile(fileName); // It seems that this variable is not used in your script.
   var ssBaseUrl = getMostRecentFile(fileName);
   var blob = _getAsBlob(ssBaseUrl);
   _exportBlob(blob, fileName);
}

function getMostRecentFile(fileName) {
  ssIt = DriveApp.getFilesByName(fileName);
  var createDate, prevCreateDate, tempSsId;
  var result = [];
  while (ssIt.hasNext()) {
    var file = ssIt.next();
    result.push([file.getDateCreated(),file.getId(), file.getUrl()]);
  } 
  var dTime = result.sort()[0][0];
  var tempSsId = result.sort()[0][1];
  var ssBaseUrl = result.sort()[0][2];
  return ssBaseUrl;
}

function _getAsBlob(ssUrlBase) {
  var ssUrlBase = ssUrlBase.replace(/\/edit.+/,"");  // Modified
  var exportUrl = ssUrlBase
  + '/export?exportFormat=pdf&format=pdf'
  + '&size=LETTER'
  + '&portrait=true'
  + '&fitw=true'
  + '&top_margin=0.75'
  + '&bottom_margin=0.75'
  + '&left_margin=0.7'
  + '&right_margin=0.7'
  + '&sheetnames=false&printtitle=false'
  + '&pagenum=false'
  + '&gridlines=true'
  + '&fzr=FALSE';
  var response = UrlFetchApp.fetch(exportUrl, {headers: {Authorization: 'Bearer ' + ScriptApp.getOAuthToken()}});
  return response.getBlob();
}

注:

  • 根据你的问题,我无法理解 _exportBlob(blob, fileName);。所以它假设 _exportBlob(blob, fileName); 有效。