通过电子邮件自动创建、附加和发送从 Google 表单创建的 pdf 的 Google Appscript 代码不起作用?

问题描述 投票:0回答:1

我正在尝试为我的团队创建一份自动报告。我对编码有非常基本的了解,但不足以在出现问题或不起作用时真正排除故障或添加自己的代码。我非常感谢您提前提供的任何帮助。

当我的团队填写表格时,有一个电子邮件下拉问题,他们将在其中选择将 PDF 通过电子邮件发送到的位置,以便可以打印出来并签名。我需要脚本来识别并使用 C 列中的这封电子邮件来发送电子邮件和附加的 PDF。

我找到了这个视频,并按照步骤一步一步进行操作,除了他收集电子邮件并在电子表格中设置 pdf 链接的部分(在视频的“添加 PDF 链接”部分下)。

我的设置和他一模一样。此代码一直运行到电子邮件和附件部分,因为它从工作表中获取信息,使用文档模板创建临时文件,从临时文件创建 PDF,将 PDF 保存在正确的文件夹中,然后删除临时文件。但即使执行日志显示已完成,也不会发送任何电子邮件。

如果这太长了,我很抱歉,我试图做到彻底。

我尝试多次重新观看该视频,以确保我一步一步遵循说明,并且我的代码与他的代码匹配。我尝试用 Google 搜索解决方案并观看其他视频,但我的技能水平仅限于复制代码和进行细微更改,而不是故障排除或引入新代码。

**这是我到目前为止的代码: **

function afterFormSubmit(e) {
  const info = e.namedValues;
  const pdfFile = createPDF(info);
  
  sendEmail(e.namedValues['email'][0],pdfFile);   

}


function sendEmail(email, pdfFile){
 
  GmailApp.sendEmail('email', "Subj", "Body", {
  attachments: [pdfFile], 
  name: 'My Company'
});

}

// everything from here below works, use {} and '' instead of {{}} and "", use [0] instead of [1][2]etc.

function createPDF(info){

const pdfFolder = DriveApp.getFolderById("1YPB0_lw2QPw5bMrmrlw3_kcIchRGQmYG");
const tempFolder = DriveApp.getFolderById("1Um5h762rBmI-j_J8arTCmMoOEvEyKdIX");
const templateDoc = DriveApp.getFileById("1kN5DJqi04cY638B-0yKZYg-JHaLmt1jvv6kH25PjIgc");

const newTempFile = templateDoc.makeCopy(tempFolder);

const openDoc = DocumentApp.openById(newTempFile.getId());
const body = openDoc.getBody();
body.replaceText("{timestamp}", info['Timestamp'][0]);
body.replaceText("{name}", info['name'][0]);
body.replaceText("{email}", info['email'][0]);
body.replaceText("{body}", info['body'][0]);
openDoc.saveAndClose();

const blobPDF = newTempFile.getAs(MimeType.PDF);
const pdfFile = pdfFolder.createFile(blobPDF).setName(info['name'][0] + " " + new Date());
tempFolder.removeFile(newTempFile);

}

**当前触发器设置: ** 部署:头 事件:来自电子表格 = 表单提交时 功能:表单提交后

**执行日志给我的上述代码的错误: ** 异常:无效参数:附件

at sendEmail(Code:12:12)
at afterFormSubmit(Code:5:3)

Here is the code above in appscript Trigger set up from appscript This is the Sheet and the information it collected, emails are in Column C. Here is the Google Doc Template I created Here is the PDF created from the temporary file using the Template

google-apps-script google-forms email-attachments
1个回答
0
投票

修改要点:

  • 在您的显示脚本中,在
    GmailApp.sendEmail('email', "Subj", "Body", {
    处,
    email
    不用作变量。这样就会发生错误。我想这可能是您当前问题
    **Error for the above code the Execution log gives me: ** Exception: Invalid argument: attachments
    的原因。
  • 而且,在您的脚本中,
    pdfFile
    const pdfFile = createPDF(info);
    未定义。因为函数
    createPDF
    没有返回值。

当这些要点反映在你的脚本中时,就会变成如下所示。

修改后的脚本:

function afterFormSubmit(e) {
  const info = e.namedValues;
  const pdfFile = createPDF(info);
  sendEmail(e.namedValues['email'][0], pdfFile);
}

function sendEmail(email, pdfFile) {
  GmailApp.sendEmail(email, "Subj", "Body", {
    attachments: [pdfFile],
    name: 'My Company'
  });
}

function createPDF(info) {
  const pdfFolder = DriveApp.getFolderById("1YPB0_lw2QPw5bMrmrlw3_kcIchRGQmYG");
  const tempFolder = DriveApp.getFolderById("1Um5h762rBmI-j_J8arTCmMoOEvEyKdIX");
  const templateDoc = DriveApp.getFileById("1kN5DJqi04cY638B-0yKZYg-JHaLmt1jvv6kH25PjIgc");

  const newTempFile = templateDoc.makeCopy(tempFolder);
  const openDoc = DocumentApp.openById(newTempFile.getId());
  const body = openDoc.getBody();
  body.replaceText("{timestamp}", info['Timestamp'][0]);
  body.replaceText("{name}", info['name'][0]);
  body.replaceText("{email}", info['email'][0]);
  body.replaceText("{body}", info['body'][0]);
  openDoc.saveAndClose();
  const blobPDF = newTempFile.getAs(MimeType.PDF);
  const pdfFile = pdfFolder.createFile(blobPDF).setName(info['name'][0] + " " + new Date());
  newTempFile.setTrashed(true);
  return pdfFile;
}
  • 在此修改后的脚本中,当提交 Google 表单时,将运行函数

    afterFormSubmit
    并创建 PDF 文件,并发送一封带有 PDF 文件附件的电子邮件。

  • 在这种情况下,假设该函数包含在与 Google Form 链接的 Google Spreadsheet 的容器绑定脚本中。并且,功能

    afterFormSubmit
    已作为 OnSubmit 触发器安装。请注意这一点。

注:

  • 不幸的是,我不知道你的实际Google Form和情况。所以,我只建议你们展示脚本的修改点。
© www.soinside.com 2019 - 2024. All rights reserved.