【发布时间】:2017-01-04 00:57:49
【问题描述】:
我正在尝试在 Google 表格中编写一个脚本,该脚本从主表格中提取数据,并发送包含填充数据的电子邮件,所有这些都基于单元格是“是”还是“否”
我有这个脚本绑定到一个 onEdit() 触发器(我不知道我是否正确调用)并且我实际上已经发送了电子邮件,但是某处有一个错误最终将我的整个函数转储到电子邮件的正文。
Here's a copy of the sheet in question
这是我的代码:
function sendEmails() {
var trackOriginSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(e);
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Master");
var startRow = 2; // First row of data to process
var numRows = 506; // Number of rows to process
// Fetch the range of cells A2:B3
var dataRange = sheet.getRange(startRow, 1, numRows, 26);
// Fetch values for each row in the Range.
var data = dataRange.getValues();
var refDesc = function(trackOriginSheet) {
var mirandaSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Miranda");
var piperSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Piper");
var lowesSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Lowes");
var goldenSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Golden");
var refDescContent = trackOriginSheet;
if (trackOriginSheet === mirandaSheet) {
var getMirSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Miranda");
var startMirRow = 2; // First row of data to process
var numRowsMir = 506; // Number of rows to process
// Fetch the range of cells A2:B3
var dataRangeMir = sheet.getRange(startRow, 1, numRows, 26);
// Fetch values for each row in the Range.
var dataMir = dataRange.getValues();
for (var j in dataMir) {
var secondRowMir = dataMir[i];
var intRefDescMir = secondRowMir[3];
return intRefDescMir;
}
} else if (trackOriginSheet === piperSheet) {
var getPipSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Piper");
var startPipRow = 2; // First row of data to process
var numRowsPip = 506; // Number of rows to process
// Fetch the range of cells A2:B3
var dataRangePip = sheet.getRange(startRow, 1, numRows, 26);
// Fetch values for each row in the Range.
var dataPip = dataRange.getValues();
for (var k in dataPip) {
var secondRowPip = dataPip[k];
var intRefDescPip = secondRowPip[3];
return intRefDescPip;
}
} else if (trackOriginSheet === lowesSheet) {
var getLowSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Lowes");
var startLowRow = 2; // First row of data to process
var numRowsLow = 506; // Number of rows to process
// Fetch the range of cells A2:B3
var dataRangeLow = sheet.getRange(startRow, 1, numRows, 26);
// Fetch values for each row in the Range.
var dataLow = dataRange.getValues();
for (var l in dataLow) {
var secondRowLow = dataLow[l];
var intRefDescLow = secondRowLow[3];
return intRefDescLow;
}
} else if (trackOriginSheet === goldenSheet) {
var getGoldSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Golden");
var startGoldRow = 2; // First row of data to process
var numRowsGold = 506; // Number of rows to process
// Fetch the range of cells A2:B3
var dataRangeGold = sheet.getRange(startRow, 1, numRows, 26);
// Fetch values for each row in the Range.
var dataGold = dataRange.getValues();
for (var m in dataGold) {
var secondRowGold = dataGold[m];
var intRefDescGold = secondRowGold[3];
return intRefDescGold;
}
}
};
for (var i in data) {
var row = data[i];
var teacherEmail = row[1]; // Teacher Email Column
var iepEmail = row[16]; // IEP Manager Email Column
var counselorEmail = row[19]; // Assigned Counselor Email Column
var referallEmails = [teacherEmail, iepEmail, counselorEmail]; //All admin emails
var studName = row[4] + " " + row[3]; //Stores student name in selected sheet
var adminActions = row[3];
var datesAppl = row[4];
var message = "The referral submitted for " + studName + "has been completed. The following action(s) were taken:" + refDesc + " " + adminActions + " " + datesAppl + " " + "Please email the member of the discipline team who handled the referral if you have any questions or concerns, at: ";
var subject = "Referral: " + studName;
MailApp.sendEmail(teacherEmail, subject, message);
}
}
Logger.log(sendEmails);
《规范》存在问题,并且可能膨胀到超出其需要的程度。这是我的第一个 JavaScript 的“实际应用”,我之前真的只做过调试。这次我在调试自己的逻辑时遇到了麻烦:)
我在这个网站和 Google 上搜索了一个小时左右,但没有找到任何可以帮助我解决问题的方法。有人有什么建议吗?
【问题讨论】:
-
我注意到的第一件事是
row[4] row[3]是student name,但row[3]是adminActions和row[4]是datesAppl- 所以你显然对那里开始的事情感到困惑with ... 但您的函数在消息中发送的原因是因为您使用的是refDesc而不是refDesc()... 但请注意refDesc函数在调用时需要一个参数,所以refDesc()不会这样做 - 可以不要说参数需要是什么,但它在函数中的名称是trackOriginSheet -
除了 Jaromanda X 的评论,我想指出,在您使用
var trackOriginSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(e);的一开始,请查看 event object 参考以了解如何使用e(您首先必须在function sendEmails(e)中声明,否则e不会做任何事情)。另外,请阅读空格并使用它们:) -
感谢 Jaromanda 和 Vytautas 的提示 :) 看看您指出的内容,很明显我需要遍历并确保我的变量是我需要的,并且它们'被叫到正确的地方:) 我盯着这个看了太久,并说服自己我没有得到任何东西,而不是仔细检查我的工作。
-
感谢大家指出我在这方面为自己制造的一些问题。我今天修复了 Boatload 的错误。我在这里创建了另一个主题:stackoverflow.com/questions/41475521,因为我的 for 循环仍然存在问题,如果你想看看 :)
标签: javascript email google-apps-script google-sheets conditional