我正在运行一个脚本来帮助小组跟踪翻译。目标是在文档更新时通知(通过电子邮件发送)翻译(每种语言都有自己的文档)。每个收件人电子邮件都列在他们负责翻译的文档行中的自己的单元格中。该脚本偶尔会运行,但我认为它会被列入电子邮件地址应该列出的文本(不是电子邮件)的单元格。
我一直收到错误:'无法发送电子邮件:没有收件人(第21行,文件"翻译通知")'
有没有办法更新我的脚本以使其无效的电子邮件收件人?
{{1}}
编辑:我意识到我正在寻找忽略所有无效电子邮件(不仅仅是空白单元格)的功能并继续运行。
答案 0 :(得分:1)
您可以更改
if (cell.indexOf('B') != -1)
{
message = sheet.getRange('A' + sheet.getActiveCell().getRowIndex()).getValue()
}
var subject = 'The ' + sheet.getRange('F' + sheet.getActiveCell().getRowIndex()).getValue() + ' ' + sheet.getRange('A' + sheet.getActiveCell().getRowIndex()).getValue() + ' needs your Translation';
var body = sheet.getRange('A' + sheet.getActiveCell().getRowIndex()).getValue() + ' has been updated. Can you please update ' + sheet.getRange('G' + sheet.getActiveCell().getRowIndex()).getValue() + '? Please remember to update the date column in the Resource Document when the translation is complete:' + ss.getUrl();
MailApp.sendEmail(recipients, subject, body);
要:
if (cell.indexOf('B') != -1 && recipients != "")
{
message = sheet.getRange('A' + sheet.getActiveCell().getRowIndex()).getValue()
var subject = 'The ' + sheet.getRange('F' + sheet.getActiveCell().getRowIndex()).getValue() + ' ' + sheet.getRange('A' + sheet.getActiveCell().getRowIndex()).getValue() + ' needs your Translation';
var body = sheet.getRange('A' + sheet.getActiveCell().getRowIndex()).getValue() + ' has been updated. Can you please update ' + sheet.getRange('G' + sheet.getActiveCell().getRowIndex()).getValue() + '? Please remember to update the date column in the Resource Document when the translation is complete:' + ss.getUrl();
MailApp.sendEmail(recipients, subject, body);
}
修改强>
您可以使用最适合您的任何电子邮件正则表达式,但这样的事情应该有效:
var recipients = sheet.getRange('J' + sheet.getActiveCell().getRowIndex()).getValue().toString();
var getEmails = recipients.match(/([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9._-]+)/gi);
现在你有一系列希望有效的电子邮件,你可以循环使用,如果仍有错误,可以使用try / catch。
注意:没有电子邮件正则表达式是完美的
答案 1 :(得分:0)
替换:
Column is not iterable
使用:
MailApp.sendEmail(recipients, subject, body);
答案 2 :(得分:0)
如果您愿意,可以简单地执行try...catch
。所以你会有
try {
MailApp.sendEmail(recipients, subject, body);
}
catch(error) {
Logger.log(error)
}
应该通过拼写错误和空行。它仍然会尝试发送消息,因此在性能方面它不是很好,但是这应该继续使用代码尽管有错误(你可以用catch
做其他事情,比如添加发生错误的行,或者字符串错误的地址,然后将列表发送给您自己或谁应该检查电子邮件)
编辑:考虑提问者留给答案的评论。
到目前为止的其他答案(包括我的)假设你在不同的单元格中有电子邮件,你会迭代电子邮件,每个发送1。请澄清您的问题,因为您要查看的是从字符串中删除格式无效的电子邮件。
在这种情况下,你最好的选择(禁止实际电子邮件验证,这要求你有一个绝对肯定正确的电子邮件的完整列表)可能是检查字符串格式错误。以下示例将删除任何没有正确格式的电子邮件(请注意,不存在的电子邮件地址仍将保留,并且运行该脚本的任何人都会收到有关邮件传递失败的回复):
function myFunction() {
var recipients = 'email1@gmail.com,email2gmail.com,email3@gmail.com,email4@gmailcom'
var arr = recipients.split(',')
var arr2 = []
var i;
for (i = 0; i < arr.length; i++){
if (arr[i].indexOf('@') != -1){
if (arr[i].indexOf('@') < arr[i].lastIndexOf('.')) {
arr2.push(arr[i])
}
}
}
recipients = arr2.toString()
return
}
注意,你可以通过去除当前数组中的元素来稍微改进for循环,只使用单个数组而不是2,但是为了简单起见,为了更快,我编写了最简单的变体。从本质上讲,这是一个简单的逻辑:
@
符号?所有电子邮件都必须有一个.
符号之后是否有@
符号。同样,这不是
考虑到结尾可能是.co
或其他一些错字,只有那个
它存在。您可以检查一下完整的@gmail.com
或
其他域名,如果你绝对肯定所有的电子邮件都有
那个域。最后我们将数组合并回字符串(如果你真的想要,你可以在技术上逃脱重用1 recipients
变量)。我个人认为如果你这样做,代码看起来会有点麻烦。
再次注意,这里有一些限制,您可能需要添加额外的条件。例如,我不考虑对以下情况进行任何检查:
电子邮件地址没有任何
email@gmail.
)email@.
或email@.com
)虽然我不确定是否是gmail
会失败的