Google apps script 为什么当我将函数2与函数1组合时,函数2的列号会偏移?

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

我正在尝试设计一个脚本,当从“On form submit”触发器调用时,它会按顺序执行以下两件事情:

  • 将顺序ID号添加到新提交的Google表单数据行的第一列

  • 通过电子邮件从此行发送信息

  • 我有两个单独的脚本,每一个都可以独立运行,但是当我尝试一起运行时,第二个脚本中的列号会偏移-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(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中添加日期戳