从 Google 个应用程序发送电子邮件
Sending Email from Google Apps
我对 Google 应用程序(特别是 Google 电子表格)的自定义脚本感到困惑。
我重现了 https://developers.google.com/apps-script/articles/sending_emails#section-2-improvements 中的课程(参见 "Section 2: Improvements"),但它不起作用:即使单元格已包含 "EMAIL_SENT"(我使用 "NOTIFICATION_SENT" 而不是这个)。
这里是自定义脚本的来源:
var NOTIFICATION_SENT = "NOTIFICATION_SENT";
function NotifyNewBooking() {
var sheet = SpreadsheetApp.getActiveSheet();
var startRow = 2; // First row of data to process
var numRows = 47; // Number of rows to process
// Fetch the range of cells A2:N48
var dataRange = sheet.getRange(startRow, 1, numRows, 17)
// 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 emailAddress = "natalya@berdyanskaya56.ru";
var subject = "Строка № " + row + ": " + "новое бронирование";
var message = "Уведомление о новом бронировании!" + "\n" + "\nДанные нового бронирования:" + "\n" + "\nЗаезд: " + row[0] + "\nВыезд: " + row[1] + "\nНомер: " + "«" + row[2] + "»" + "\nТип размещения: " + row[3] + "\nЦена за ночь: " + row[4] + " руб." + "\nВнесённый депозит: " + row[8] + " руб." + "\n" + "\nИмя и фамилия гостя: " + row[5] + "\nМобильный телефон: " + row[6] + "\nЭлектронная почта: " + row[7] + "\n" + "\nПримечание: " + row[11] + "\n" + "\n* Просмотреть список всех бронирований можно тут: " + "www.bitly.com/b56guests";
var notificationSent = row[17]; // The column where notification status is put
if (notificationSent != NOTIFICATION_SENT) { // Prevents sending duplicates
MailApp.sendEmail(emailAddress, subject, message, {name: "Мини-гостиница Бердянская 56", replyTo: "ruslan@berdyanskaya56.ru"});
sheet.getRange(startRow + i, 17).setValue(NOTIFICATION_SENT);
// Make sure the cell is updated right away in case the script is interrupted
SpreadsheetApp.flush();
}
}
}
此处的目标是仅当列 row[17]
中的单元格不包含 NOTIFICATION_SENT
时才发送电子邮件。请向我提供如何修复它的有力建议。
在此先感谢您!
问题出在这一行:var notificationSent = row[17];
尝试通过记录值 Logger.log(row[17])
和 Logger.log(row[16])
来调试代码,您将在行 [17] 中得到 undefined
,在行 [16] 中得到 NOTIFICATION_SENT
。
为什么?因为Range.getValues returns一个二维数组,数组索引从0开始。
也是在documentation中指定的。
Remember that while a range index starts at 1, 1, the JavaScript array will be indexed from [0][0].
所以 while 行很好,因为你已经在 for 循环中将 i 初始化为 0。
for (var i = 0; i < data.length; ++i) {
var row = data[i];
....
获取列时应将索引减1。
var notificationSent = row[17 - 1];
因为如果你有 17 列,数组中的第一个值将从索引 0 开始到 16。
我对 Google 应用程序(特别是 Google 电子表格)的自定义脚本感到困惑。
我重现了 https://developers.google.com/apps-script/articles/sending_emails#section-2-improvements 中的课程(参见 "Section 2: Improvements"),但它不起作用:即使单元格已包含 "EMAIL_SENT"(我使用 "NOTIFICATION_SENT" 而不是这个)。
这里是自定义脚本的来源:
var NOTIFICATION_SENT = "NOTIFICATION_SENT";
function NotifyNewBooking() {
var sheet = SpreadsheetApp.getActiveSheet();
var startRow = 2; // First row of data to process
var numRows = 47; // Number of rows to process
// Fetch the range of cells A2:N48
var dataRange = sheet.getRange(startRow, 1, numRows, 17)
// 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 emailAddress = "natalya@berdyanskaya56.ru";
var subject = "Строка № " + row + ": " + "новое бронирование";
var message = "Уведомление о новом бронировании!" + "\n" + "\nДанные нового бронирования:" + "\n" + "\nЗаезд: " + row[0] + "\nВыезд: " + row[1] + "\nНомер: " + "«" + row[2] + "»" + "\nТип размещения: " + row[3] + "\nЦена за ночь: " + row[4] + " руб." + "\nВнесённый депозит: " + row[8] + " руб." + "\n" + "\nИмя и фамилия гостя: " + row[5] + "\nМобильный телефон: " + row[6] + "\nЭлектронная почта: " + row[7] + "\n" + "\nПримечание: " + row[11] + "\n" + "\n* Просмотреть список всех бронирований можно тут: " + "www.bitly.com/b56guests";
var notificationSent = row[17]; // The column where notification status is put
if (notificationSent != NOTIFICATION_SENT) { // Prevents sending duplicates
MailApp.sendEmail(emailAddress, subject, message, {name: "Мини-гостиница Бердянская 56", replyTo: "ruslan@berdyanskaya56.ru"});
sheet.getRange(startRow + i, 17).setValue(NOTIFICATION_SENT);
// Make sure the cell is updated right away in case the script is interrupted
SpreadsheetApp.flush();
}
}
}
此处的目标是仅当列 row[17]
中的单元格不包含 NOTIFICATION_SENT
时才发送电子邮件。请向我提供如何修复它的有力建议。
在此先感谢您!
问题出在这一行:var notificationSent = row[17];
尝试通过记录值 Logger.log(row[17])
和 Logger.log(row[16])
来调试代码,您将在行 [17] 中得到 undefined
,在行 [16] 中得到 NOTIFICATION_SENT
。
为什么?因为Range.getValues returns一个二维数组,数组索引从0开始。
也是在documentation中指定的。
Remember that while a range index starts at 1, 1, the JavaScript array will be indexed from [0][0].
所以 while 行很好,因为你已经在 for 循环中将 i 初始化为 0。
for (var i = 0; i < data.length; ++i) {
var row = data[i];
....
获取列时应将索引减1。
var notificationSent = row[17 - 1];
因为如果你有 17 列,数组中的第一个值将从索引 0 开始到 16。