首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么当我将函数2与函数1结合时,函数2的列号偏移?

为什么当我将函数2与函数1结合时,函数2的列号偏移?
EN

Stack Overflow用户
提问于 2019-06-18 18:16:05
回答 3查看 77关注 0票数 0

我正在尝试编写一个脚本,在从‘’触发器调用时,按顺序执行这两项操作:

  1. 向新提交的Google窗体数据行的第一列中添加顺序ID号,
  2. 通过电子邮件从该行发送信息。

我有两个独立的脚本,它们各自工作得很好,但是当我试图一起运行它们时,第二个脚本中的列号就会被-1所抵消,这意味着ncDate在电子邮件中显示为ncID,ncType显示为ncDate等等。

我尝试以这种方式组合这两个脚本:

代码语言:javascript
复制
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被添加,然后发送电子邮件,但是所有的数据都从一个列中拉到所需的列的左边。我在这里错过了什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-06-19 11:30:05

在实现触发器时,可选参数“e”允许您访问事件范围。然而,正如Cooper所指出的: Google表单将在第一栏中添加日期标记。因此,列的索引将与所期望的相比较而移动。因此,您必须相应地移动从中检索数据的单元格的索引。

至于您的顺序ID号,我建议您在一个空单元格中实现它,并在另一个新列中实现它。

例如:您可以对它使用第13列(知道第1列是为时间戳保留的,而第2至12列是用表单提交的数据填充的)。

代码语言:javascript
复制
  sheetID.getRange(colID,13).setValue(colID)

或者,您也可以使用工作表的范围,而不是事件范围-以避免列偏移。看起来是这样的:

代码语言:javascript
复制
 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)
}
票数 1
EN

Stack Overflow用户

发布于 2019-06-18 20:13:50

这个问题很可能是sendEmail没有按照您预期的范围被调用。可以通过在Logger.log(range.getA1Notation())函数的顶部插入日志语句(例如Logger.log(range.getA1Notation()))来调试此问题。

如果范围不是您想要的,请尝试使用不同的、更显式的范围调用函数--而不是附加到e的函数。

我相信您正在尝试选择工作表中最底层(最近的)行,包括一个未包含在e中的额外列。如果是这样的话,这可能对你有用:

代码语言:javascript
复制
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组合它。

票数 1
EN

Stack Overflow用户

发布于 2019-06-18 18:42:07

我认为使用onFormSubmit()触发器会好得多。但是请记住,Google表单总是将日期放在第一列中。因此,我建议您不要修改表单链接页。

电子邮件所需的数据将出现在e.values或e.namedValues中,通过在电子表格中使用onFormSubmit,您可以始终保证获得正确的数据,即使表单提交来自表单的其他用户也是如此。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56654869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档