Google Apps Script邮件脚本IF语句失效:消息框变量赋值异常
问题分析与解决方案
你遇到的问题核心在于**Browser.msgBox的返回值类型判断错误**,导致你的条件逻辑完全失效,进而出现了不管点击「是」还是「否」都会发送邮件的问题。
为什么会出错?
Browser.msgBox返回的不是你以为的字符串'yes'或'no',而是枚举常量:
- 用户点击「YES」时,返回
Browser.Buttons.YES(对应数值1) - 用户点击「NO」时,返回
Browser.Buttons.NO(对应数值2)
你用字符串'yes'去和返回值做比较,这个条件永远不会成立——但你说邮件无论如何都会发送,大概率是之前的代码逻辑写错了(比如误写为if(confirm),而任何非0数值都会被JS视为true)。不过只要修正判断条件,就能让逻辑回到正轨。
修正后的可用代码
我已经帮你调整了判断逻辑,同时优化了几处容易踩坑的细节:
function sendEmails1() { var ss = SpreadsheetApp.getActiveSpreadsheet(); ss.setActiveSheet(ss.getSheetByName("Send-Emails 1")); var sheet = SpreadsheetApp.getActiveSheet(); var dataRange = sheet.getRange("A2:D10"); var data = dataRange.getValues(); var sender = Browser.inputBox('Sender Name', 'Please enter your first and last name', Browser.Buttons.OK_CANCEL); // 修正:点击Cancel时返回的是null,不是字符串'cancel' if(sender !== null){ // 推荐用for...of遍历数组,比for...in更安全(不会遍历到原型链属性) for (const rowData of data) { var emailAddress = rowData[1]; var recipient = rowData[2]; var text1 = 'text'; var text2 = 'text'; var text3 = 'text'; var text4 = 'text'; var text5 = 'text'; var signoff = 'Kind Regards,'; var sendername = sender ; var org = 'text'; var message = recipient + ',\n\n' + text1 + ' ' + text2 + ' ' + text3 + '\n\n' + text4 + '\n\n' + text5 + '\n\n' + signoff + '\n\n' + sendername + '\n\n' + org; var subject = 'text'; // 弹出邮件预览确认框 var confirm = Browser.msgBox('Send the following email?', 'To: ' + emailAddress + '\\n\\n' + recipient + ',\\n\\n' + message, Browser.Buttons.YES_NO); // 修正:用枚举常量判断,而非字符串 if(confirm === Browser.Buttons.YES){ MailApp.sendEmail(emailAddress, subject, message); } } } }
额外优化说明
- 取消输入的判断修正:
Browser.inputBox点击Cancel时返回的是null,不是字符串'cancel',原来的判断会导致用户取消后仍进入循环,现在已经修正。 - 数组遍历优化:
for (i in data)可能会意外遍历到数组原型链上的属性,换成for...of更安全可靠。
修改后脚本就会完全符合你的预期:点击「YES」发送邮件,点击「NO」则跳过当前邮件的发送流程。
内容的提问来源于stack exchange,提问作者Arlen Spexarth
相关产品推荐
相关产品推荐

