繁体   English   中英

Google表单文件上传-如何使用表单提交的图像并将其嵌入到电子邮件中

[英]Google Forms File upload - How to use image submitted by form and embed it in an email

我在一个项目上有些卡住,可以提供一些帮助。

目的:我正在尝试提交Google表单,其中包含各种数据和图片。 然后,这将触发使用表单数据的HTML电子邮件并嵌入图像。

到目前为止,除了嵌入图像,我可以做所有事情。

到目前为止,这就是我所拥有的。

代码

      function getData() {
   var sh = SpreadsheetApp.getActive()
       .getSheetByName('Form responses 1');
   return sh.getRange(sh.getLastRow(), 1, 1, sh.getLastColumn())
       .getValues()[0]

}





function testEmail() {
   var htmlBody = HtmlService
       .createTemplateFromFile('mail_template')
       .evaluate()
       .getContent();
var mailADdy = "myemail@email.co.uk";
   MailApp.sendEmail({
       to:mailADdy,
       subject: 'Test Email markup - ' + new Date(),
       htmlBody: htmlBody,
   });

  }

mail_template.html

    <!DOCTYPE html>
<html>
  <head>
    <style>
      @media only screen and (max-device-width: 480px) {
        /* mobile-specific CSS styles go here */
      }
    </style>
  </head>
  <body>
   <? var data = getData(); ?>
   <? var first = data[2]; ?>
   <? var second = data[3]; ?>
       <? var third = data[4]; ?>
       <? var fourth = data[5]; ?>

  /* imageUpload var is the link to the image that's been uploaded, in "https://drive.google.com/open?id=ID" format"*/
       <? var imageUpload = data[6]; ?>

   /* Below are some things that I've tried and failed */
   <? var imageID = imageUpload.replace("https://drive.google.com/open?id=","");?>
  <? var imageBlob = UrlFetchApp.fetch(imageUpload).getBlob().setName("imageBlob");?>
   <? var imageBlob = DriveApp.getFileById(imageID).getBlob();?>





    <div class="main">
      <p style="text-align: center;"><strong>This is a test HTML email.</strong></p>
      <table style="margin-left: auto; margin-right: auto;">
        <tbody>
          <tr>
            <td style="text-align: left;">First question to be put here</td>
            <td style="text-align: right;"><strong><?= first ?></strong> </td>
          </tr>
          <tr>
            <td style="text-align: left;">Second question here</td>
            <td style="text-align: right;"><?= second ?></td>
          </tr>
          <tr>
            <td style="text-align: left;">Third question here</td>
            <td style="text-align: right;"><?= third ?></td>
          </tr>
          <tr>
            <td style="text-align: left;">Image Upload test</td>
            <td style="text-align: right;"><?= imageUpload ?></td>
          </tr>
        </tbody>
      </table>
      <p></p>
      <p style="text-align: center;"><img src="https://imageurl.com" alt="Logo" /></p>
    </div>
  </body>
</html>

getData函数返回工作表中的最后一行数据(这将是最近提交的表单)testEmail发送电子邮件。

mail_template包含电子邮件的HTML。 布局等

通过使用Scriplet,我可以将表单值输入到电子邮件中并发送。

但是,无论我对图像尝试过什么,都无法正确完成。

当我尝试在HTML文件中使用以下脚本时,

 <? var imageBlob = UrlFetchApp.fetch(imageUpload).getBlob().setName("imageBlob");?>

我收到以下错误。

执行失败:您无权调用提取

我也尝试过:

<? var imageBlob = DriveApp.getFileById(imageID).getBlob();?>

但仍然无法正常工作。

我确实尝试按照此链接中的信息进行操作,即如何使用MailApp在电子邮件中包含内嵌图像

但是无法将其翻译为我的示例,因为他们没有使用单独的HTML文件

任何帮助/指针表示赞赏。

首先,您得到的错误是因为您从未授予GAS访问UrlFetch或DriveApp的权限。 这似乎违反直觉,但是如果仅查看GAS脚本,您会发现您永远不会在GAS端调用这些函数。 因此,当您运行GAS脚本时,编译器将永远不会看到对UrlFetch或DriveApp的调用。 因此,不要征得您的许可来运行它。 但是,在运行时,评估方法尝试访问这些方法,并且授权失败。

可以通过在GAS端使用虚拟函数来调用此函数来解决此问题。 像这样

function dummyFunction(){
 DriveApp.getRootFolder()
 UrlFetchApp.fetch("www.google.com")
}

您不需要运行这些功能,但是在编译期间,它将要求这些方法的授权。 因此,当您运行评估方法时,授权不会有任何问题。

其次,要按此处所述引入内嵌图像,您不必在HTML端获得imageBlob。 您将需要获得一个GAS脚本。 您只需要像这样在html页面上包含img标签即可。

<tr>
    <td style="text-align: left;">Image</td>
    <td style="text-align: right;"><img src ="cid:imageKey"/></td>
</tr>

在GAS上,您将像这样修改代码:

function testEmail() {
   var htmlBody = HtmlService
       .createTemplateFromFile('mail_template')
       .evaluate()
       .getContent();
        var mailADdy = "myemail@email.co.uk";
        var data = getData()
        var imageUpload = data[6]; 
        var imageID = imageUpload.replace("https://drive.google.com/open?id=","")
        // Use one of the below method to get the imageBloB
        var imageBlob = UrlFetchApp.fetch(imageUpload).getBlob().setName("imageBlob")
       //var imageBlob = DriveApp.getFileById(imageID).getBlob()

   MailApp.sendEmail({
       to:mailADdy,
       subject: 'Test Email markup - ' + new Date(),
       htmlBody: htmlBody,
       inlineImages:
       {
         imageKey: imageBlob,
       }
   });

  }

如果使用此技术,则不必在html页面上调用urlFetch或DriveApp,并且可以删除那些scriptlet行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM