以文本形式从Gmail获取pdf附件

以文本形式从Gmail获取pdf附件,pdf,text,google-apps-script,gmail,email-attachments,Pdf,Text,Google Apps Script,Gmail,Email Attachments,我在网上搜索了一下&堆栈溢出,但没有找到解决方案。我尝试做的是:我通过邮件获得某些附件,我希望这些附件作为(纯)文本进行进一步处理。我的脚本如下所示: function MyFunction() { var threads = GmailApp.search ('label:templabel'); var messages = GmailApp.getMessagesForThreads(threads); for (i = 0; i < messages.leng

我在网上搜索了一下&堆栈溢出,但没有找到解决方案。我尝试做的是:我通过邮件获得某些附件,我希望这些附件作为(纯)文本进行进一步处理。我的脚本如下所示:

function MyFunction() {

  var threads = GmailApp.search ('label:templabel'); 
  var messages = GmailApp.getMessagesForThreads(threads); 

   for (i = 0; i < messages.length; ++i)
   {
     j = messages[i].length; 
   var messageBody = messages[i][0].getBody(); 
   var messageSubject = messages [i][0].getSubject();
     var attach = messages [i][0].getAttachments();
     var attachcontent = attach.getContentAsString();
    GmailApp.sendEmail("mail", messageSubject, "", {htmlBody: attachcontent});
    }
}
函数MyFunction(){
var threads=GmailApp.search('label:templabel');
var messages=GmailApp.getMessagesForThreads(线程);
对于(i=0;i
不幸的是,这不起作用。这里有人知道我该怎么做吗?有可能吗

事先非常感谢

最好的,Phil

编辑:为DriveApp更新,因为DocsList已弃用


我建议将其分为两个问题。第一个是如何从电子邮件中获取pdf附件,第二个是如何将pdf转换为文本

正如您所发现的,
getContentAsString()
不会神奇地将pdf附件更改为纯文本或html。我们需要做一些更复杂的事情

首先,我们将附件作为一个实用程序类,由多个服务用来交换数据

var blob=attachments[0].getAs(MimeType.PDF);
因此,分离出第二个问题,并保持这样的假设,即我们只对标记为
templabel
的每个线程的第一条消息的第一个附件感兴趣,下面是
myFunction()
的外观:

/**
*获取标记为“templabel”的消息,并向自己发送
*新电子邮件中的pdf附件。
*/
函数myFunction(){
var threads=GmailApp.search('label:templabel');
var threadsMessages=GmailApp.getMessagesForThreads(线程);
对于(var thread=0;thread
我们依靠一个助手函数,
pdfToText()
,将pdf
blob
转换为文本,然后将其作为纯文本电子邮件发送给我们自己。这个助手函数有多种选择;通过设置
keepTextfile:false
,我们选择让它将PDF文件的文本内容返回给我们,并且在驱动器中不保留任何剩余文件

pdfToText() 此实用程序可用。这里提供了几个例子

A表示可以使用驱动器API的
insert
方法执行,但未提供代码详细信息。随着高级Google服务的引入,可以通过Google应用程序脚本轻松访问驱动器API。您确实需要在编辑器的
Resources>Advanced Google Services
下打开并启用
Drive API

pdfToText()
使用驱动器服务从PDF文件的内容生成Google文档。不幸的是,这包含了文档中每页的“图片”——对此我们无能为力。然后,它使用常规的
DocumentService
将文档正文提取为纯文本

/**
*见要点:https://gist.github.com/mogsdad/e6795e438615d252584f
*
*使用内置OCR将pdf文件(blob)转换为驱动器上的文本文件。
*默认情况下,文本文件将放置在根文件夹中,并具有相同的
*名称为源pdf(但扩展名为“txt”)。选项:
*keepPdf(布尔值,默认为false)保留原始PDF文件的副本。
*keepGdoc(布尔值,默认为false)保留OCR谷歌文档文件的副本。
*keepTextfile(布尔值,默认为true)保留文本文件的副本。
*存储文件的路径(字符串,默认为空)文件夹路径。
*OCR语言(ISO 639-1代码)默认为“en”。
*textResult(布尔值,默认为false)如果为true且keepTextfile为true,则返回
*文本内容的字符串。如果keepTextfile
*为false,返回的文本内容不带
*关于这一选择。否则,请返回
*文本文件的id。
*
*@param{blob}pdfFile blob包含pdf文件
*@param{object}options(可选)对象指定处理细节
*
*@返回文本文件(默认)或文本内容的{string}id
*/
函数pdfToText(pdfFile,选项){
//确保已启用高级驱动器服务
试一试{
Drive.Files.list();
}
捕获(e){
抛出新错误(“要使用pdfToText(),首先在参考资料>高级谷歌服务中启用“驱动API”);
}
//设置默认选项
选项=选项| |{};
options.keepTextfile=options.hasOwnProperty(“keepTextfile”)?options.keepTextfile:true;
//为文件创建准备资源对象
var父项=[];
if(options.path){
push(getDriveFolderFromPath(options.path));
}
var pdfName=pdfFile.getName();
变量资源={
标题:pdfName,
mimeType:pdfFile.getContentType(),
家长:家长
};
//如果需要,将PDF保存到驱动器
if(options.keepPdf){
var file=Drive.Files.insert(资源,pdfFile);
}
//将PDF另存为GDOC
resource.title=pdfName.replace(/pdf$/,'gdoc');
变量insertOpts={
是的,
ocrLanguage:options.ocrLanguage | |“en”
}
var gdocFile=Drive.Files.insert(资源、pdfFile、insertOpts);
//从GDOC获取文本