google-apps-script - 有没有办法在循环浏览消息列表时从谷歌表格向多个用户发送多封电子邮件?
问题描述
嘿,这是我在 StackOverflow 上的第一个问题。我已经在这段代码上苦苦挣扎了两天,并试图上下移动循环,但什么也没发生。该代码没有显示任何错误,但我没有收到邮件。我要做的是向多个用户(表:Sheet1)发送多条消息(表:buysignals)。似乎每个人都将每封电子邮件作为唯一的接收者。前任 如果 Buysignals 表中有文字,您会收到一封新邮件。这里有人可以帮助我如何解决它吗?
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
并且在退出循环后,您将发送一封电子邮件 - 到最后保存的电子邮件地址 - 这个问题可以通过
MailApp.sendEmail(emailAddress, subject, message);
在for
循环内插入来解决
样本:
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()
推荐阅读
- go - 为什么接口分配比方法调用更严格?
- python - scikit-learn 训练出错:无法分配具有形状的数组
- regex - Splunk - 正则表达式从源中提取字段
- c# - 如何从列表中删除第一个重复值?
- tensorflow - object_detection_API 中权重 maskrcnn Tensorflow 2 的不正确冻结
- sql - 在一个引用另一个子查询中的表的子查询中添加 where 条件 (ANSI SQL)
- azure - Azure VM:: 如何以编程方式获取对应于 vm 大小的虚拟机的 vcpus 和 GiB 内存
- powershell - 无法以管理员身份在新安装的 Windows Server 2016 上安装 NuGet?
- mysql - 在本地存储图像并在反应应用程序中引用它们
- go - 在go中按域查找IP地址