Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Html Gmail中%7的花括号_Html_Gmail_Mailmerge - Fatal编程技术网

Html Gmail中%7的花括号

Html Gmail中%7的花括号,html,gmail,mailmerge,Html,Gmail,Mailmerge,我使用Gmail来填充html模板。因此,在我的google sheet文档中,我提供了一列数据,在html模板中,我使用{{Name}},这个脚本替换数据并发送邮件: //版权所有Martin Hawksey 2020 // //根据Apache许可证2.0版(以下简称“许可证”)获得许可;你不可以 //除非符合许可证,否则请使用此文件。你可以得到一份 //许可证的有效期在 // // https://www.apache.org/licenses/LICENSE-2.0 // //

我使用Gmail来填充html模板。因此,在我的google sheet文档中,我提供了一列数据,在html模板中,我使用{{Name}},这个脚本替换数据并发送邮件:

//版权所有Martin Hawksey 2020
//
//根据Apache许可证2.0版(以下简称“许可证”)获得许可;你不可以
//除非符合许可证,否则请使用此文件。你可以得到一份
//许可证的有效期在
//
//     https://www.apache.org/licenses/LICENSE-2.0
//
//除非适用法律要求或书面同意,软件
//根据许可证进行的分发是按“原样”分发的,没有
//明示或暗示的任何种类的保证或条件。见
//管理下权限和限制的特定语言的许可证
//执照。
/**
*@OnlyCurrentDoc
*/
/**
*更改这些名称以匹配您在电子邮件中使用的列名
*收件人地址和电子邮件发送列。
*/
const RECIPIENT_COL=“RECIPIENT”;
const EMAIL\u SENT\u COL=“EMAIL SENT”;
/** 
*创建菜单项“邮件合并”,以便用户在下拉列表中运行脚本。
*/
函数onOpen(){
const ui=SpreadsheetApp.getUi();
ui.createMenu(“邮件合并”)
.addItem('发送电子邮件','发送电子邮件')
.addToUi();
}
/**
*从工作表数据发送电子邮件。
*@param{string}主题行(可选)用于电子邮件草稿消息
*@param{Sheet}Sheet从中读取数据
*/
函数sendmails(subjectLine,sheet=SpreadsheetApp.getActiveSheet()){
subjectLine=“Beste{{Voornaam},vul nu jouw personalijke progressie&feedback maaltijdplan in!”;
//获取要用作模板的Gmail邮件草稿
const emailTemplate=GetgMiltTemplatefromDrafts_uU2;(主题行);
//从传递的工作表中获取数据
const dataRange=sheet.getDataRange();
//获取HT Andrew Roberts范围内每行的显示值
// https://mashe.hawksey.info/2020/04/a-bulk-email-mail-merge-with-gmail-and-google-sheets-solution-evolution-using-v8/#comment-187490
//@见https://developers.google.com/apps-script/reference/spreadsheet/range#getdisplayvalues
const data=dataRange.getDisplayValues();
//假设第1行包含我们的列标题
const heads=data.shift();
//获取名为“电子邮件状态”的列的索引(假设标题名称是唯一的)
//@见http://ramblings.mcpher.com/Home/excelquirks/gooscript/arrayfunctions
const emailSentColIdx=heads.indexOf(EMAIL\u SENT\u COL);
//将二维数组转换为对象数组
//@见https://stackoverflow.com/a/22917499/1027723
//有关漂亮的版本,请参见https://mashe.hawksey.info/?p=17869/#comment-184945
const obj=data.map(r=>(heads.reduce((o,k,i)=>(o[k]=r[i]| |,'',o),{}));
//用于记录发送的电子邮件
常数输出=[];
//循环遍历所有数据行
对象forEach(函数(行,行IDX){
//“仅发送电子邮件”为“电子邮件发送”,单元格为空且未被筛选器隐藏
如果(行[电子邮件发送列]=''){
试一试{
const msgObj=fillInTemplateFromObject_(emailTemplate.message,第行);
//@见https://developers.google.com/apps-script/reference/gmail/gmail-app#sendEmail(字符串,字符串,字符串,对象)
//如果您需要发送带有unicode/emoji字符的电子邮件,请更改MailApp的GmailApp
//根据需要取消注释高级参数(有关限制,请参阅文档)
GmailApp.sendmail(行[RECIPIENT_COL],msgObj.subject,msgObj.text{
htmlBody:msgObj.html,
//密件抄送:a。bbc@email.com',
//抄送:a。cc@email.com',
发件人:'Info@example.com',
名称:“示例”,
//答复:a。reply@email.com',
//noReply:true,//如果电子邮件应该从通用的无回复电子邮件地址发送(gmail.com用户不可用)
附件:emailTemplate.attachments,
inlineImages:emailTemplate.inlineImages
});
//修改单元格以记录电子邮件发送日期
//out.push([new Date()]);
}捕获(e){
//修改单元格以记录错误
//out.push([e.message]);
}
}否则{
向外推送([行[发送电子邮件]);
}
});
//使用新数据更新工作表
//sheet.getRange(2,emailSentColIdx+1,out.length).setValues(out);
/**
*通过匹配主题行获取Gmail草稿消息。
*@param{string}subject_行搜索草稿邮件
*@return{object}包含主题、普通邮件和html邮件正文及附件
*/
函数GetgMiltTemplateFromDrafts(主题行){
试一试{
//获取草稿
const drafts=GmailApp.getDrafts();
//筛选与主题行匹配的草稿
const draft=drafts.filter(subjectFilter_(subject_行))[0];
//获取消息对象
const msg=draft.getMessage();
//处理内联图像和附件,以便它们可以包含在合并中
//基于https://stackoverflow.com/a/65813881/1027723
//获取所有附件和内联图像附件
const allInlineImages=draft.getMessage().getAttachments({includeInlineImages:true,includeAttachments:false});
const attachments=draft.getMessage().getAttachments({includeInlineImages:false});
常量htmlBody=msg.getBody();
//创建一个以图像名称为键的内联图像对象
//(不能依赖图像索引作为基于插入顺序的数组)
const img_obj=allInlineImages.reduce((obj,i)=>(obj[i.getName()]=i,obj),{});
//Regexp使用cid搜索所有img字符串位置
常量imgexp=RegExp(']+>','g');
常量匹配=[…htmlBody.matchAll(imgexp)];
//启动allInlineImages对象
常量inlineImagesObj={};
//根据内联图像匹配生成内联图像Sobj
matches.forEach(match=>inlineImagesObj[match[1]]=img_obj[match[2]]);
返回{message:{subject:subject_line,text:msg.getPlainBody(),html:htmlBody},
附件