Google apps script 以HTML格式获取Google文档

Google apps script 以HTML格式获取Google文档,google-apps-script,google-docs,Google Apps Script,Google Docs,我有一个疯狂的想法,我可以用谷歌驱动文档为一个简单的用户朋友建立一个网站博客。我能够创建一个contentService来编译文档列表。但是,我看不到将文档转换为HTML的方法。我知道谷歌可以在网页中呈现文档,所以我想知道是否有可能在我的内容服务中使用呈现版本 这可能吗?GAS中没有直接的方法来获取文档的HTML版本,这是一个非常古老的方法,但Henrique Abreu的工作非常好,我一直在使用它 授权过程中唯一烦人的事情是需要从脚本编辑器中调用,这使得在共享应用程序中使用(使用“脚本无法”用

我有一个疯狂的想法,我可以用谷歌驱动文档为一个简单的用户朋友建立一个网站博客。我能够创建一个contentService来编译文档列表。但是,我看不到将文档转换为HTML的方法。我知道谷歌可以在网页中呈现文档,所以我想知道是否有可能在我的内容服务中使用呈现版本


这可能吗?

GAS中没有直接的方法来获取文档的HTML版本,这是一个非常古老的方法,但Henrique Abreu的工作非常好,我一直在使用它

授权过程中唯一烦人的事情是需要从脚本编辑器中调用,这使得在共享应用程序中使用(使用“脚本无法”用户)很不方便,但这种情况只发生一次;)


还有一个由创建的,使事情(有点)更容易。。。并添加了一些其他有趣的函数。

也许这对您有用

function doGet() {
  var blob = DriveApp.getFileById('myFileId').getAsHTML();
  return HtmlService.createHtmlOutput(blob);
}

您可以尝试以下代码:

  function getGoogleDocumentAsHTML(){
  var id = DocumentApp.getActiveDocument().getId() ;
  var forDriveScope = DriveApp.getStorageUsed(); //needed to get Drive Scope requested
  var url = "https://docs.google.com/feeds/download/documents/export/Export?id="+id+"&exportFormat=html";
  var param = {
    method      : "get",
    headers     : {"Authorization": "Bearer " + ScriptApp.getOAuthToken()},
    muteHttpExceptions:true,
  };
  var html = UrlFetchApp.fetch(url,param).getContentText();
  Logger.log(html);
}

以下是根据Enrique发布的想法为新版goole AOuth剪下的小片段:

function exportAsHTML(){
  var forDriveScope = DriveApp.getStorageUsed(); //needed to get Drive Scope requested
  var docID = DocumentApp.getActiveDocument().getId();
  var url = "https://docs.google.com/feeds/download/documents/export/Export?id="+docID+"&exportFormat=html";
  var param = {
    method      : "get",
    headers     : {"Authorization": "Bearer " + ScriptApp.getOAuthToken()},
    muteHttpExceptions:true,
  };
  var html = UrlFetchApp.fetch(url,param).getContentText();
  return html; 

}
然后使用常用的mailApp:

function mailer(){
   var docbody = exportAsHTML();
   MailApp.sendEmail({
     to: "email@mail.com",
     subject: "document emailer",
     htmlBody:  docbody  });
}
希望新的解决方法能有所帮助


JDNode.js解决方案

使用

以下是如何使用google drive的node.js客户端库以html形式获取google文档

// import googleapis npm package
var google = require('googleapis');

// variables
var fileId = '<google drive doc file id>',
    accessToken = '<oauth access token>';

// oauth setup
var OAuth2 = google.auth.OAuth2,
    OAuth2Client = new OAuth2();

// set oauth credentials
OAuth2Client.setCredentials({access_token: accessToken});

// google drive setup
var drive = google.drive({version: 'v3', auth: OAuth2Client});

// download file as text/html
var buffers = [];
drive.files.export(
    {
        fileId: fileId,
        mimeType: 'text/html'
    }
)
    .on('error', function(err) {
        // handle error
    })
    .on('data', function(data) {
        buffers.push(data); // data is a buffer
    })
    .on('end', function() {
        var buffer = Buffer.concat(buffers),
            googleDocAsHtml = buffer.toString();
        console.log(googleDocAsHtml);
    });
//导入googleapis npm包
var google=require('googleapis');
//变数
var fileId=“”,
accessToken='';
//oauth设置
var OAuth2=google.auth.OAuth2,
OAuth2Client=新的OAuth2();
//设置oauth凭据
OAuth2Client.setCredentials({access_token:accessToken});
//谷歌硬盘设置
var drive=google.drive({version:'v3',auth:OAuth2Client});
//以text/html格式下载文件
var缓冲区=[];
drive.files.export(
{
fileId:fileId,
mimeType:'text/html'
}
)
.on('error',函数(err){
//处理错误
})
.on('data',函数(data){
buffers.push(data);//数据是一个缓冲区
})
.on('end',function(){
var buffer=buffer.concat(缓冲区),
googleDocAsHtml=buffer.toString();
console.log(googleDocAsHtml);
});
查看以获取更多语言和选项。

您可以使用该解决方案


作为fileId传递,google文档的id,并按照说明启用高级驱动器服务。

我也遇到了这个问题。文档HTML导出输出的HTML非常难看,因此这是我的解决方案:

/**
*获取Google文档ID,以HTML格式获取该文档,清除标记,并返回生成的HTML字符串。
*
*@param{string}谷歌文档的id
*@param{boolean}[useCaching]启用或禁用缓存。默认为true。
*@return{string}html格式的文档正文
*/
函数getContent(id,useCaching){
如果(!id){
抛出“请使用有效的Google文档ID调用此API”;
}
if(useCaching==null){
useCaching=true;
}
if(使用缓存的类型!=“布尔”){
抛出“若要指定useCaching,它必须是布尔值。”;
}
var cache=CacheService.getScriptCache();
var cached=cache.get(id);//查看是否有已解析html的缓存版本
if(缓存和使用缓存){
var html=cached;
log(“从缓存中提取文档html…”);
}否则{
log(“从文档中获取和解析新的html…”);
试一试{
var doc=DriveApp.getFileById(id);
}捕捉(错误){
抛出“请使用有效的Google文档ID调用此API”+err.message;
}
var docName=doc.getName();
var forDriveScope=DriveApp.getStorageUsed();//需要获取ScriptApp.getOAuthToken()中请求的驱动器作用域;
变量url=”https://docs.google.com/feeds/download/documents/export/Export?id=“+id+”&exportFormat=html”;
变量参数={
方法:“获取”,
标题:{“授权”:“承载者”+ScriptApp.getOAuthToken()},
muteHttpExceptions:true,
};
var html=UrlFetchApp.fetch(url,param.getContentText();
//核化整个头部部分,包括样式表和元标记
html=html.replace(/.*/,“”);
//删除几乎所有的html属性
html=html.replace(/(id | class | style | start | colspan | rowspan)=“[^”]*”/g');
//删除所有跨距以及外部html和正文
html=html.replace(//g',);
//显然,表示换行符的最佳方式
html=html.replace(/
/g,“
”); cache.put(id,html,900)//缓存文档内容15分钟,以防我们收到大量请求 } Logger.log(html); 返回html; }

谷歌文档目前有一个功能可以做到这一点。 只需下载到zip(.html),您就可以拥有一个包含html和image(如果插入)的zip存档

我知道这不是基于代码的解决方案,而是它的工作原理:)


您是否参考了Romain Vialard的库?如果是这样,您应该在您的评论中提及它。我很想回顾一下您在@HenriqueAbreu中提到的解决方法,但是链接不再可用:它是否在其他地方发布了?--谢谢,FaustoYes,我知道,他们删除了档案……无论如何,代码在许多地方仍然可见。例如,这一个。在问题跟踪器上也是如此。注意:您可能认为
DocumentApp.getActiveDocument().getAs(MimeType.HTML)
可以工作,但这会引发一个错误:
不支持从application/vnd.google-apps.document转换为text/HTML。
/**
 * Converts a file to HTML. The Advanced Drive service must be enabled to use
 * this function.
 */
function convertToHtml(fileId) {
  var file = Drive.Files.get(fileId);
  var htmlExportLink = file.exportLinks['text/html'];
  if (!htmlExportLink) {
    throw 'File cannot be converted to HTML.';
  }
  var oAuthToken = ScriptApp.getOAuthToken();
  var response = UrlFetchApp.fetch(htmlExportLink, {
    headers:{
      'Authorization': 'Bearer ' + oAuthToken
    },
    muteHttpExceptions: true
  });
  if (!response.getResponseCode() == 200) {
    throw 'Error converting to HTML: ' + response.getContentText();
  }
  return response.getContentText();
}