documentapp.getactivedocument().getBlob 给出 pdf

documentapp.getactivedocument().getBlob gives pdf

我正在尝试将 google 文档的内容发送到我的后端服务。

在我正在使用的应用程序脚本中

if(host == 'sheets'){
  var content = SpreadsheetApp.getActiveSpreadsheet().getBlob();
}else if (host == 'docs') {
  var content = DocumentApp.getActiveDocument().getBlob();
}

我获取 blob 并通过有效负载参数在 URLFetchApp.fetch() 中通过多部分表单请求发送它。

但是文档和表格的内容都是 converted/sent 我的 pdf 服务。

有什么方法可以preserve/send google 格式的文件吗?

如果不是 google 格式,那么是 Microsoft office 格式?

此致,

索拉夫

如类似 中所述,此行为是预期的。如果您想获取 Microsoft office 格式的文件内容, 您可以检查以下选项:

(选项 1):从 Advanced Drive Service

导出 URL

示例代码:

function getDocument(){
  
  var host = "docs";
  var fileId;
  var exportFormat;

  if(host == 'sheets'){
    fileId = SpreadsheetApp.getActiveSpreadsheet().getId();
    exportFormat = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
  }else if (host == 'docs') {
    fileId = DocumentApp.getActiveDocument().getId();
    exportFormat = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
  }

  var url = Drive.Files.get(fileId).exportLinks[exportFormat];
  Logger.log(url);
  var oauthToken = ScriptApp.getOAuthToken();
  var content = UrlFetchApp.fetch(url, {
    headers: {
      'Authorization': 'Bearer ' + oauthToken
    }
  }).getBlob();
  Logger.log(content.getContentType());
  content.setName("TestFile");
  MailApp.sendEmail("email@sample.com", "Test", "Test", {attachments: content});
}

先决条件:

您需要启用 Advanced Drive Service 才能使用 Drive.Files.get() 获取文件的导出 links。此请求将 return 一个 文件资源 ,您可以在其中获取 exportLinks,可以使用基于 supported export MIME Types[=26= 的密钥进行访问]


它有什么作用?

  1. 根据主机设置,根据supported export MIME Types
  2. 获取文件id和导出格式
  3. 使用Drive.Files.get()获取文件资源并根据步骤1中设置的导出格式密钥获取导出link。
  4. 使用UrlFetchApp.fetch(url, params) and get the file's blob using HTTPResponse.getBlob()

输出:


(选项 2):使用模板 url

手动创建导出 URL

示例代码:

function getDocument(){
  
  var host = "docs";
  var fileId;
  var url;

  if(host == 'sheets'){
    fileId = SpreadsheetApp.getActiveSpreadsheet().getId();
    url = "https://docs.google.com/spreadsheets/export?id="+fileId+"&exportFormat=xlsx"
  }else if (host == 'docs') {
    fileId = DocumentApp.getActiveDocument().getId();
    url = "https://docs.google.com/feeds/download/documents/export/Export?id="+fileId+"&exportFormat=docx";
  }

  Logger.log(url);
  var oauthToken = ScriptApp.getOAuthToken();
  var content = UrlFetchApp.fetch(url, {
    headers: {
      'Authorization': 'Bearer ' + oauthToken
    }
  }).getBlob();
  Logger.log(content.getContentType());
}

它有什么作用?

  1. 根据主机集,获取文件 ID 并使用此模板创建导出 link:

EXCEL: https://docs.google.com/spreadsheets/export?id=<fileId>&exportFormat=xlsx

WORD: https://docs.google.com/feeds/download/documents/export/Export?id=<fileId>&exportFormat=docx

  1. 使用UrlFetchApp.fetch(url, params) and get the file's blob using HTTPResponse.getBlob()

注:

基于 Quotas for Google Services,Url Fetch Call 的 Consumer 和 G Suite 免费版的每日配额为 20,000,而 Google Workspace 帐户的每日配额为 100,000