尝试根据复选框选择发送电子邮件
Trying to send email based on checkbox selection
如果选中 H 列中的复选框,我将尝试自动发送电子邮件。我对代码的了解几乎不足以惹上麻烦。我拥有的代码已经被弗兰肯斯坦化了,所以我知道我遗漏了一些东西,但我对此太陌生了,无法理解是什么。如果我按原样 运行 代码,如果 G 列中列出了电子邮件地址,则会发送一封电子邮件,但无论是否选中 H 列,都会发送电子邮件。如果未选中该复选框,我不想发送电子邮件。我在论坛中进行了搜索,并试图拼凑出一个适合我的解决方案,但我一直碰壁。我知道问题在于识别复选框,这就是我迷路的地方。任何帮助将不胜感激。
var EMAIL_SENT = "EMAIL_SENT";
function send1stnotice() {
var sheet = SpreadsheetApp.getActiveSheet();
var startRow = 3; // First row of data to process
var numRows = sheet.getLastRow()-1 // Number of rows to process
var dataRange = sheet.getRange(startRow, 1, numRows, 1000)
// Fetch values for each row in the Range.
var data = dataRange.getValues();
for (var i = 0; i < data.length; ++i) {
var row = data[i];
var checkbox1 =row[7];
var emailAddress = row[6];
if (emailAddress.match('@') == null){
continue;
}; // First column
var subject = "test subject";
var message = "test message";
var emailSent = row[8];
if (emailSent != EMAIL_SENT && checkbox1!= 'FALSE') { // Prevents sending duplicates
MailApp.sendEmail(emailAddress, subject, message);
sheet.getRange(startRow + i, 9).setValue(EMAIL_SENT);
// Make sure the cell is updated right away in case the script is interrupted
SpreadsheetApp.flush();
}
}
}
试试这个:
function send1stnotice() {
var sheet = SpreadsheetApp.getActiveSheet();
var startRow = 3;
var dataRange = sheet.getRange(startRow, 1, sheet.getLastRow()-2,sheet.getLastColumn());
var data = dataRange.getValues();
for (var i = 0; i < data.length; ++i) {
var row = data[i];
var checkbox1 =row[7];
var emailAddress = row[6];
var subject = "test subject";
var message = "test message";
var emailSent = sheet.getRange(startRow + i, 9).getValue();
if (emailSent != "EMAIL_SENT" && checkbox1=="TRUE") {
MailApp.sendEmail(emailAddress, subject, message);
sheet.getRange(startRow + i, 9).setValue("EMAIL_SENT");
SpreadsheetApp.flush();
}
}
}
将您的条件更改为:
if (emailSent != EMAIL_SENT && checkbox1 == true)
复选框的值是 boolean, not the string "TRUE" or "FALSE". You were checking if it equals "TRUE", but it doesn't. Because you're using getValues()
,Apps 脚本解释您在电子表格中看到的数据的实际值。
The values may be of type Number, Boolean, Date, or String, depending
on the value of the cell.
如果您想完全与电子表格中显示的数据进行比较,您可以使用getDisplayValues()
,尽管我个人很少发现需要这样做。无论如何,如果您使用 getDisplayValues()
,那么复选框将 return 全部大写的 "TRUE" 或 "FALSE" 字符串。
您可以使用 Logger.log()
来查看复选框 1 的值。
// Try with getValues()
var data = dataRange.getValues();
var checkbox1 =data[i][7];
Logger.log(typeof checkbox1); // boolean
Logger.log(checkbox1); // Returns either true or false
// Try again, but with getDisplayValues()
var data = dataRange.getDisplayValues();
var checkbox1 =data[i][7];
Logger.log(typeof checkbox1); // string
Logger.log(checkbox1); // Returns either "TRUE" or "FALSE"
如果选中 H 列中的复选框,我将尝试自动发送电子邮件。我对代码的了解几乎不足以惹上麻烦。我拥有的代码已经被弗兰肯斯坦化了,所以我知道我遗漏了一些东西,但我对此太陌生了,无法理解是什么。如果我按原样 运行 代码,如果 G 列中列出了电子邮件地址,则会发送一封电子邮件,但无论是否选中 H 列,都会发送电子邮件。如果未选中该复选框,我不想发送电子邮件。我在论坛中进行了搜索,并试图拼凑出一个适合我的解决方案,但我一直碰壁。我知道问题在于识别复选框,这就是我迷路的地方。任何帮助将不胜感激。
var EMAIL_SENT = "EMAIL_SENT";
function send1stnotice() {
var sheet = SpreadsheetApp.getActiveSheet();
var startRow = 3; // First row of data to process
var numRows = sheet.getLastRow()-1 // Number of rows to process
var dataRange = sheet.getRange(startRow, 1, numRows, 1000)
// Fetch values for each row in the Range.
var data = dataRange.getValues();
for (var i = 0; i < data.length; ++i) {
var row = data[i];
var checkbox1 =row[7];
var emailAddress = row[6];
if (emailAddress.match('@') == null){
continue;
}; // First column
var subject = "test subject";
var message = "test message";
var emailSent = row[8];
if (emailSent != EMAIL_SENT && checkbox1!= 'FALSE') { // Prevents sending duplicates
MailApp.sendEmail(emailAddress, subject, message);
sheet.getRange(startRow + i, 9).setValue(EMAIL_SENT);
// Make sure the cell is updated right away in case the script is interrupted
SpreadsheetApp.flush();
}
}
}
试试这个:
function send1stnotice() {
var sheet = SpreadsheetApp.getActiveSheet();
var startRow = 3;
var dataRange = sheet.getRange(startRow, 1, sheet.getLastRow()-2,sheet.getLastColumn());
var data = dataRange.getValues();
for (var i = 0; i < data.length; ++i) {
var row = data[i];
var checkbox1 =row[7];
var emailAddress = row[6];
var subject = "test subject";
var message = "test message";
var emailSent = sheet.getRange(startRow + i, 9).getValue();
if (emailSent != "EMAIL_SENT" && checkbox1=="TRUE") {
MailApp.sendEmail(emailAddress, subject, message);
sheet.getRange(startRow + i, 9).setValue("EMAIL_SENT");
SpreadsheetApp.flush();
}
}
}
将您的条件更改为:
if (emailSent != EMAIL_SENT && checkbox1 == true)
复选框的值是 boolean, not the string "TRUE" or "FALSE". You were checking if it equals "TRUE", but it doesn't. Because you're using getValues()
,Apps 脚本解释您在电子表格中看到的数据的实际值。
The values may be of type Number, Boolean, Date, or String, depending on the value of the cell.
如果您想完全与电子表格中显示的数据进行比较,您可以使用getDisplayValues()
,尽管我个人很少发现需要这样做。无论如何,如果您使用 getDisplayValues()
,那么复选框将 return 全部大写的 "TRUE" 或 "FALSE" 字符串。
您可以使用 Logger.log()
来查看复选框 1 的值。
// Try with getValues()
var data = dataRange.getValues();
var checkbox1 =data[i][7];
Logger.log(typeof checkbox1); // boolean
Logger.log(checkbox1); // Returns either true or false
// Try again, but with getDisplayValues()
var data = dataRange.getDisplayValues();
var checkbox1 =data[i][7];
Logger.log(typeof checkbox1); // string
Logger.log(checkbox1); // Returns either "TRUE" or "FALSE"