我正在尝试编写一个脚本,在从‘’触发器调用时,按顺序执行这两项操作:
我有两个独立的脚本,它们各自工作得很好,但是当我试图一起运行它们时,第二个脚本中的列号就会被-1所抵消,这意味着ncDate在电子邮件中显示为ncID,ncType显示为ncDate等等。
我尝试以这种方式组合这两个脚本:
function assignID(e) {
var sheetID = SpreadsheetApp.getActiveSheet();
var colID = SpreadsheetApp.getActiveSheet().getLastRow();
sheetID.getRange(colID,1).setValue(colID);
SpreadsheetApp.flush();
sendEmail(e.range);
}
function sendEmail(range) {
var values = range.getValues();
var col = values[0];
var ncID = col[0];
var ncDate = col[1];
var ncType = col[2];
var ncLocation = col[3];
var ncJobNo = col[4];
var ncPartNo = col[5];
var ncPartDesc = col[6];
var ncPartQty = col[7];
var ncDetails = col[8];
var ncPhotos = col[9];
var ncProposedSol = col[10];
var ncEmail = col[11];
var emailRecipients = "test@email.com";
var emailSubject = ncID+": "+ncType+" ("+ncEmail+")";
var emailBody = "<h3>Here is the latest issue "+ncEmail+":</h3><hr /> \
<p> \
<h1 style='line-height:90%'>"+ncType+": "+ncLocation+"<br /> \
<span style='font-size:60%'>("+ncDate+")</span></h1> \
</p><hr /> \
<p> \
<strong>ISSUE TYPE:</strong><br /> \
"+ncType+" \
</p><p> \
<strong>OCCURRENCE LOCATION:</strong><br /> \
"+ncLocation+" \
</p><p> \
<strong>JOB NUMBER:</strong><br /> \
"+ncJobNo+" \
</p><p> \
<strong>PART NUMBER:</strong><br /> \
"+ncPartNo+" \
</p><p> \
<strong>LINKS:</strong><ul> \
<li>Photo(s) = "+ncPhotos+"</li> \
<li>Email = "+ncEmail+"</li> \
</ul></p><p> \
<strong>PART DESCRIPTION:</strong><br /> \
"+ncPartDesc+" \
</p><p> \
<strong>FOLLOW UP:</strong> \
"+ncEmail+" \
</p>";
MailApp.sendEmail({
to: emailRecipients,
subject: emailSubject,
htmlBody: emailBody
});
}表单ID被添加,然后发送电子邮件,但是所有的数据都从一个列中拉到所需的列的左边。我在这里错过了什么?
发布于 2019-06-19 11:30:05
在实现触发器时,可选参数“e”允许您访问事件范围。然而,正如Cooper所指出的: Google表单将在第一栏中添加日期标记。因此,列的索引将与所期望的相比较而移动。因此,您必须相应地移动从中检索数据的单元格的索引。
至于您的顺序ID号,我建议您在一个空单元格中实现它,并在另一个新列中实现它。
例如:您可以对它使用第13列(知道第1列是为时间戳保留的,而第2至12列是用表单提交的数据填充的)。
sheetID.getRange(colID,13).setValue(colID)或者,您也可以使用工作表的范围,而不是事件范围-以避免列偏移。看起来是这样的:
function assignID(e) {
var sheetID = SpreadsheetApp.getActiveSheet()
var colID = SpreadsheetApp.getActiveSheet().getLastRow()
sheetID.getRange(colID,13).setValue(colID)
var range =sheetID.getRange(colID,1,1, sheetID.getMaxColumns())
SpreadsheetApp.flush()
sendEmail(range)
}发布于 2019-06-18 20:13:50
这个问题很可能是sendEmail没有按照您预期的范围被调用。可以通过在Logger.log(range.getA1Notation())函数的顶部插入日志语句(例如Logger.log(range.getA1Notation()))来调试此问题。
如果范围不是您想要的,请尝试使用不同的、更显式的范围调用函数--而不是附加到e的函数。
我相信您正在尝试选择工作表中最底层(最近的)行,包括一个未包含在e中的额外列。如果是这样的话,这可能对你有用:
function assignID(e) {
var sheet = SpreadsheetApp.getActiveSheet();
var colID = sheet.getLastRow();
sheet.getRange(colID, 1).setValue(colID);
SpreadsheetApp.flush();
var eventRow = e.range.getRow();
var eventNumCols = e.range.getNumColumns();
var startRow = eventRow;
var startCol = 1;
var numRows = 1;
var numCols = eventNumCols + 1;
var range = sheet.getRange(startRow, startCol, numRows, numCols);
sendEmail(range);
}
function sendEmail(range) {
var values = range.getValues();
var row = values[0];
var ncID = row[0];
var ncDate = row[1];
var ncType = row[2];
var ncLocation = row[3];
var ncJobNo = row[4];
var ncPartNo = row[5];
var ncPartDesc = row[6];
var ncPartQty = row[7];
var ncDetails = row[8];
var ncPhotos = row[9];
var ncProposedSol = row[10];
var ncEmail = row[11];
...
}此外,您可能希望了解模板HTML功能,它允许您将大部分HTML放在自己的文件中,而不是使用JavaScript组合它。
发布于 2019-06-18 18:42:07
我认为使用onFormSubmit()触发器会好得多。但是请记住,Google表单总是将日期放在第一列中。因此,我建议您不要修改表单链接页。
电子邮件所需的数据将出现在e.values或e.namedValues中,通过在电子表格中使用onFormSubmit,您可以始终保证获得正确的数据,即使表单提交来自表单的其他用户也是如此。
https://stackoverflow.com/questions/56654869
复制相似问题