Google apps script 为什么当我将函数2与函数1组合时,函数2的列号会偏移?
我正在尝试设计一个脚本,当从“On form submit”触发器调用时,它会按顺序执行以下两件事情:Google apps script 为什么当我将函数2与函数1组合时,函数2的列号会偏移?,google-apps-script,Google Apps Script,我正在尝试设计一个脚本,当从“On form submit”触发器调用时,它会按顺序执行以下两件事情: 将顺序ID号添加到新提交的Google表单数据行的第一列 通过电子邮件从此行发送信息 我有两个单独的脚本,每一个都可以独立运行,但是当我尝试一起运行时,第二个脚本中的列号会偏移-1,这意味着ncDate在电子邮件中显示为ncID,ncType显示为ncDate,等等 我尝试过以这种方式组合这两个脚本: function assignID(e) { var sheetID = Spreads
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(e){
var sheetID=SpreadsheetApp.getActiveSheet();
var colID=SpreadsheetApp.getActiveSheet().getLastRow();
sheetID.getRange(colID,1).setValue(colID);
SpreadsheetApp.flush();
发送电子邮件(e.range);
}
发送电子邮件功能(范围){
var values=range.getValues();
var col=值[0];
var ncID=列[0];
var ncDate=列[1];
var ncType=col[2];
var ncLocation=col[3];
var ncJobNo=col[4];
var ncPartNo=列[5];
var ncPartDesc=col[6];
var ncPartQty=col[7];
var ncDetails=col[8];
var-ncPhotos=col[9];
var NcposatedSol=col[10];
var ncEmail=col[11];
var emailRecipients=”test@email.com";
var emailSubject=ncID+“:“+ncType+”(“+ncEmail+”)”;
var emailBody=“这是最新一期”+ncEmail+:
\
\
“+ncType+”:“+ncLocation+”
\
(“+ncDate+”)\
\
\
发行类型:
\
“+ncType+”\
\
发生地点:
\
“+ncLocation+”\
\
作业编号:
\
“+ncJobNo+”\
\
零件号:
\
“+ncPartNo+”\
\
链接:\
- 照片=“+ncPhotos+”
\
- Email=“+ncEmail+”
\
\
零件说明:
\
“+ncPartDesc+”\
\
跟进:\
“+ncEmail+”\
”;
MailApp.sendmail({
致:电子邮件收件人,
主题:电邮主题,,
htmlBody:emailBody
});
}
添加表单ID,然后发送电子邮件,但所有数据都从所需列左侧的一列中提取。我在这里遗漏了什么?我想你最好使用触发器。但请记住,谷歌表单总是将日期放在第一列。因此,我建议您不要修改表单链接表
电子邮件所需的数据可以是e.values或e.namedValues,通过在电子表格中使用onFormSubmit,您可以始终保证即使表单的其他用户快速提交表单,您也能获得正确的数据。我认为您最好使用触发但请记住,谷歌表单总是将日期放在第一列。因此,我建议您不要修改表单链接表
电子邮件所需的数据可以是e.values或e.namedValues,通过在电子表格中使用onFormSubmit,您可以始终保证即使表单提交速度很快,也能从表单的其他用户处获得正确的数据。问题可能是
发送电子邮件
未使用您期望的范围调用。您可以通过在sendmail
函数顶部插入日志语句来调试问题,例如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放在自己的文件中,而不是使用JavaScript编写。问题可能是,
sendmail
的调用范围没有达到您预期的范围。您可以通过在sendmail
函数顶部插入日志语句来调试问题,例如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放在自己的文件中,而不是使用JavaScript编写文件。在实现触发器时,可选参数“e”允许您访问事件范围。然而,正如库珀指出的:谷歌表单将把日期戳放在第一列。因此,与您期望的相比,列的索引将发生移动。因此,您必须相应地移动从中检索数据的单元格的索引 至于您的顺序ID号,我建议您在一个空单元格中,在另一个新列中实现它 例如: 您可以使用第13列(知道第1列是为时间戳保留的,第2到12列由表单提交的数据填充) 或者,也可以使用图纸的范围,而不是事件范围,以避免列偏移。它看起来是这样的:
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)
}
实现触发器时,可选参数“e”允许您访问事件范围。然而,正如库珀指出的那样:谷歌表单将在fi中添加日期戳