2013-06-05 2 views
2

Я пытаюсь автоматически сохранить квитанции (из Amazon), которые я получаю в GMail, чтобы Dropbox. Поэтому я написал сценарий, который:Автоматически конвертировать письма с меткой Gmail в PDF и отправлять их на адрес электронной почты

  1. автоматически выберите письма с определенным ярлыком
  2. преобразует тело письма в HTML
  3. преобразует HTML в PDF
  4. электронной почты ПРВ тела и прикрепление к IFTTT (который автоматически сохраняет вложения в раздаточной)
  5. удаляет временные файлы
  6. удаляет метку

Сценарий работает и генерирует bodydochtml, но конвертация PDF и электронная почта не работают. Я смотрю на этот сценарий часами. Где ошибка в моем скрипте?

Спасибо!

Function send_Gmail_as_PDF(){ 

    var gLabel = "#Receipt"; 
    var thread = GmailApp.search("label:" + gLabel); 
    for (var x=0; x<thread.length; x++) {  
    var messages = thread[x].getMessages(); 

    for (var y=0; y<messages.length; y++) { 
     var attach = messages[y].getAttachments(); 
     var body = messages[y].getBody(); 

     // Create an HTML File from the Message Body 
     var bodydochtml = DocsList.createFile('body.html', body, "text/html") 
     var bodyId=bodydochtml.getId() 

     // Convert the HTML to PDF 
     var bodydocpdf = bodydochtml.getAs('application/pdf').getBytes(); 

     // Does the Gmail Message have any attachments? 
     if(attach.length>0){ 

     var file=DocsList.createFile(attach[0]); 
     var pdf=file.getAs('application/pdf').getBytes(); 

     var attach_to_send = {fileName: 'pdftest.pdf', 
      content:pdf, mimeType:'application/pdf'}; 
     var body_to_send = {fileName: 'body.pdf', 
      content:bodydocpdf, mimeType:'application/pdf'}; 

     // Send the PDF to any email address 
     MailApp.sendEmail('[email protected]', 
         'transfer email as pdf : body & attachment', 
         'see attachment', {attachments:[attach_to_send,body_to_send]}); 

    // Trash the temporary PDF and HTML files 
    file.setTrashed(true); 
    DocsList.getFileById(bodyId).setTrashed(true) 
    } 
    } 
} 
    // Message Processed; Remove the Google Drive Label 
GmailApp.getUserLabelByName(gLabel) 
     .removeFromThread(thread[x]); 
} 
+0

Вы получаете сообщение об ошибке? Если да, включите его. –

+0

Я получаю «Не удается найти метод (класс) (класс) removeFromThread ((класс)). (Строка 46, файл« Код »)», но ничего о неудачной конвертации в PDF или отправке электронного письма. – user2456702

+0

@Sergeinsas - Конечно, вы можете создать html-файл тела таким образом. Это не проблема - речь идет о просмотре переменных. – Mogsdad

ответ

3

Ошибка на линии 46 идет вверх, когда thread[x] равна нулю. Поскольку у вас есть этот оператор за пределами цикла, который имеет дело с thread [x], вы ВСЕГДА имеете нуль. Переместите оператор в цикл, и эту проблему избежать.

Внутри вашего цикла сообщений вы проверяете, есть ли у сообщений какие-либо вложения, if(attach.length>0){ и продолжайте только с сообщением, если оно есть. Разве вы не хотите продолжать отправлять электронное письмо только с помощью тела pdf? Если это так, нам нужно что-то сделать с фиксированным массивом в {attachments:[attach_to_send,body_to_send]}. Лучше было бы построить массив вложений, когда мы идем, начиная с body_to_send. Добавить:

 var attachmentList = []; 
     attachmentList.push(body_to_send); 

Еще лучше, если сообщение содержит несколько вложений - вы бы хотели их всех. Чтобы сделать это, поместите обработку вставки внутри цикла вместо if и убедитесь, что вы перемещаете файл temp-файла вместе с ним. (Это должно было быть внутри if в любом случае, потому что если бы не было никакой привязанности, то setTrashed() вызов будет врезаться.)

 // Process all attachments 
     for (var att = 0; att < attach.length; att++) {  
     ... 
     attachmentList.push(attach_to_send); 

     // Trash the temporary file 
     file.setTrashed(true); 
     } 

Вот код, с этими изменениями - это прекрасно работает:

function send_Gmail_as_PDF() { 

    var gLabel = "#Receipt"; 
    var thread = GmailApp.search("label:" + gLabel); 
    for (var x = 0; x < thread.length; x++) { 
    var messages = thread[x].getMessages(); 

    for (var y = 0; y < messages.length; y++) { 
     var attach = messages[y].getAttachments(); 
     var body = messages[y].getBody(); 

     // Create an HTML File from the Message Body 
     var bodydochtml = DocsList.createFile('body.html', body, "text/html") 
     var bodyId = bodydochtml.getId() 

     // Convert the HTML to PDF 
     var bodydocpdf = bodydochtml.getAs('application/pdf').getBytes(); 

     var body_to_send = { 
     fileName: 'body.pdf', 
     content: bodydocpdf, 
     mimeType: 'application/pdf' 
     }; 

     var attachmentList = []; 
     attachmentList.push(body_to_send); 

     // Trash the temporary file 
     bodydochtml.setTrashed(true); 

     // Process all attachments 
     for (var att = 0; att < attach.length; att++) { 

     var file = DocsList.createFile(attach[att]); 
     var pdf = file.getAs('application/pdf').getBytes(); 

     var attach_to_send = { 
      fileName: 'pdftest.pdf', 
      content: pdf, 
      mimeType: 'application/pdf' 
     }; 
     attachmentList.push(attach_to_send); 

     // Trash the temporary file 
     file.setTrashed(true); 
     } 
    } 

    // Send the PDF to any email address 
    MailApp.sendEmail('[email protected]', 
     'transfer email as pdf : body & attachment', 
     'see attachment', { 
     attachments: attachmentList 
     }); 

    // Message Processed; Remove the Google Drive Label 
    GmailApp.getUserLabelByName(gLabel) 
     .removeFromThread(thread[x]); 
    } 
} 

Код был помещен через prettifier.

+0

Спасибо, что именно я искал! – user2456702

0

это код, который я написал некоторое время назад делает работу, если прикрепленный в формате, который может быть преобразован в формат PDF. Он получает сообщение в последнем потоке и отправляет тело и вложение только в том случае, если вложение присутствует. Это тестовый скрипт.

function getAttachAndBody(){ 
    var firstThread = GmailApp.getInboxThreads(0,1)[0]; 
    var message = firstThread.getMessages()[0]; 
    var attach = message.getAttachments(); 
    var body = message.getBody();//is a string 
    var bodydochtml = DocsList.createFile('body.html', body, "text/html") 
    var bodyId=bodydochtml.getId() 
    var bodydocpdf = bodydochtml.getAs('application/pdf').getBytes(); 
    if(attach.length>0){ 
    var file=DocsList.createFile(attach[0]) 
    var pdf=file.getAs('application/pdf').getBytes(); 
    var attach_to_send = {fileName: 'pdftest.pdf',content:pdf, mimeType:'application/pdf'}; 
    var body_to_send = {fileName: 'body.pdf',content:bodydocpdf, mimeType:'application/pdf'}; 
// MailApp.sendEmail('[email protected]', 'transfer email as pdf : body ', 'see attachment', {attachments:[body_to_send]}); 
    MailApp.sendEmail('[email protected]', 'transfer email as pdf : body & attachment', 'see attachment', {attachments:[attach_to_send,body_to_send]}); 
    file.setTrashed(true); 
    DocsList.getFileById(bodyId).setTrashed(true) 
    } 
} 
Смежные вопросы