有没有办法在循环浏览邮件列表时从 google 工作表向多个用户发送多封电子邮件?
Is there a way to send multiple emails to multiple users from google sheets while looping through a list of messages?
嘿,这是我在 Whosebug 上的第一个问题。
我已经为这段代码苦苦挣扎了两天,并试图上下移动循环,但什么也没发生。该代码没有显示任何错误,但我没有收到邮件。
我想要做的是向多个用户 (sheet: Sheet1) 发送多条消息 (sheet: buysignals)。似乎每个人都将每封电子邮件作为唯一的收件人。 f.ex。如果 Buysignals sheet 中有文本,您会收到一封新邮件。
这里有人可以帮我解决吗?
function sendBuySignal() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Buysignals");
const dataRange = sheet.getRange("A2:R17");
const data = dataRange.getValues();
data.forEach(function (rowData) {
const ticker = rowData[0];
// Stock info
const kurtosis = rowData[1];
const sigma = rowData[2];
const mCap = rowData[17];
const std = rowData[4];
const timeStamp = rowData[6];
const buyPrice = rowData[8];
const buyIndicator = rowData[16];
// Send Signal Mail
if (buyIndicator > 0) {
const greeting = 'The stock ' + ticker + ',\n'
const buyMessage = 'Is at ' + timeStamp + ' in the buy zone at ' + buyPrice + '. With a kurtosis of ' + kurtosis + ', sigma ' + sigma + ', mcap in bill ' + mCap + '.';
const greatJobMessage = 'Hurry up! Go buy it :)';
const message = [greeting, buyMessage, greatJobMessage].join('\n');
const subject = 'Test: New Buy ' + ticker;
// Fetch the email address
const emailRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
const n=emailRange.getLastRow();
for (var i = 2; i > n+1 ; i++ ) {
const emailAddress = emailRange.getRange(i,1).getValue();
}
MailApp.sendEmail(emailAddress, subject, message);
}
return
})
}
问题与循环有关
- 语法
for (var i = 2; i > n+1 ; i++ ) {
无法工作
- 假设最后一行大于起始行(即大于 2),条件
i > n+1
永远不会满足,因此您不会进入循环 - 相反您应该指定 i < n
- 它是
n
而不是 n+1
因为你从第二行开始而不是第一行 (i = 2
)
MailApp.sendEmail(emailAddress, subject, message);
位于 for
循环之外
- 这意味着在每个循环中该函数都会覆盖
emailAddress
并且在退出循环后您将发送一封电子邮件 - 到最后保存的电子邮件地址
- 这个问题可以通过在
for
循环中插入 MailApp.sendEmail(emailAddress, subject, message);
来解决
样本:
function sendBuySignal() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Buysignals");
const dataRange = sheet.getRange("A2:R17");
const data = dataRange.getValues();
var sheet1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
var n = sheet1.getLastRow();
const emails = sheet1.getRange("A2:A" + n).getValues();
data.forEach(function (rowData) {
const ticker = rowData[0];
// Stock info
const kurtosis = rowData[1];
const sigma = rowData[2];
const mCap = rowData[17];
const std = rowData[4];
const timeStamp = rowData[6];
const buyPrice = rowData[8];
const buyIndicator = rowData[16];
// Send Signal Mail
if (buyIndicator > 0) {
Logger.log("buyIndicator > 0");
const greeting = 'The stock ' + ticker + ',\n'
const buyMessage = 'Is at ' + timeStamp + ' in the buy zone at ' + buyPrice + '. With a kurtosis of ' + kurtosis + ', sigma ' + sigma + ', mcap in bill ' + mCap + '.';
const greatJobMessage = 'Hurry up! Go buy it :)';
const message = [greeting, buyMessage, greatJobMessage].join('\n');
const subject = 'Test: New Buy ' + ticker;
// Fetch the email address
for (var i = 0; i < emails.length ; i++ ) {
var emailAddress = emails[i][0];
Logger.log("email: " + emailAddress);
MailApp.sendEmail(emailAddress, subject, message);
}
}
})
}
请注意,对于此示例,我允许自己在进入循环之前检索所有电子邮件。这比在每个循环迭代中多次调用 getRange()
多 more efficient。
嘿,这是我在 Whosebug 上的第一个问题。 我已经为这段代码苦苦挣扎了两天,并试图上下移动循环,但什么也没发生。该代码没有显示任何错误,但我没有收到邮件。 我想要做的是向多个用户 (sheet: Sheet1) 发送多条消息 (sheet: buysignals)。似乎每个人都将每封电子邮件作为唯一的收件人。 f.ex。如果 Buysignals sheet 中有文本,您会收到一封新邮件。 这里有人可以帮我解决吗?
function sendBuySignal() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Buysignals");
const dataRange = sheet.getRange("A2:R17");
const data = dataRange.getValues();
data.forEach(function (rowData) {
const ticker = rowData[0];
// Stock info
const kurtosis = rowData[1];
const sigma = rowData[2];
const mCap = rowData[17];
const std = rowData[4];
const timeStamp = rowData[6];
const buyPrice = rowData[8];
const buyIndicator = rowData[16];
// Send Signal Mail
if (buyIndicator > 0) {
const greeting = 'The stock ' + ticker + ',\n'
const buyMessage = 'Is at ' + timeStamp + ' in the buy zone at ' + buyPrice + '. With a kurtosis of ' + kurtosis + ', sigma ' + sigma + ', mcap in bill ' + mCap + '.';
const greatJobMessage = 'Hurry up! Go buy it :)';
const message = [greeting, buyMessage, greatJobMessage].join('\n');
const subject = 'Test: New Buy ' + ticker;
// Fetch the email address
const emailRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
const n=emailRange.getLastRow();
for (var i = 2; i > n+1 ; i++ ) {
const emailAddress = emailRange.getRange(i,1).getValue();
}
MailApp.sendEmail(emailAddress, subject, message);
}
return
})
}
问题与循环有关
- 语法
for (var i = 2; i > n+1 ; i++ ) {
无法工作
- 假设最后一行大于起始行(即大于 2),条件
i > n+1
永远不会满足,因此您不会进入循环 - 相反您应该指定i < n
- 它是
n
而不是n+1
因为你从第二行开始而不是第一行 (i = 2
)
MailApp.sendEmail(emailAddress, subject, message);
位于for
循环之外
- 这意味着在每个循环中该函数都会覆盖
emailAddress
并且在退出循环后您将发送一封电子邮件 - 到最后保存的电子邮件地址 - 这个问题可以通过在
for
循环中插入MailApp.sendEmail(emailAddress, subject, message);
来解决
样本:
function sendBuySignal() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Buysignals");
const dataRange = sheet.getRange("A2:R17");
const data = dataRange.getValues();
var sheet1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
var n = sheet1.getLastRow();
const emails = sheet1.getRange("A2:A" + n).getValues();
data.forEach(function (rowData) {
const ticker = rowData[0];
// Stock info
const kurtosis = rowData[1];
const sigma = rowData[2];
const mCap = rowData[17];
const std = rowData[4];
const timeStamp = rowData[6];
const buyPrice = rowData[8];
const buyIndicator = rowData[16];
// Send Signal Mail
if (buyIndicator > 0) {
Logger.log("buyIndicator > 0");
const greeting = 'The stock ' + ticker + ',\n'
const buyMessage = 'Is at ' + timeStamp + ' in the buy zone at ' + buyPrice + '. With a kurtosis of ' + kurtosis + ', sigma ' + sigma + ', mcap in bill ' + mCap + '.';
const greatJobMessage = 'Hurry up! Go buy it :)';
const message = [greeting, buyMessage, greatJobMessage].join('\n');
const subject = 'Test: New Buy ' + ticker;
// Fetch the email address
for (var i = 0; i < emails.length ; i++ ) {
var emailAddress = emails[i][0];
Logger.log("email: " + emailAddress);
MailApp.sendEmail(emailAddress, subject, message);
}
}
})
}
请注意,对于此示例,我允许自己在进入循环之前检索所有电子邮件。这比在每个循环迭代中多次调用 getRange()
多 more efficient。