Google apps script 如何更新工作表中新提交的表单响应上的字段?

Google apps script 如何更新工作表中新提交的表单响应上的字段?,google-apps-script,google-sheets-api,Google Apps Script,Google Sheets Api,我有一个谷歌表格和工作表,我正在使用。当用户提交表单时,我在运行的工作表的OnFormSubmit中有代码。使用他们提交的ID,我可以在该表的第二个选项卡中查找数据,并通过电子邮件发送给某人 我想添加我在回复表中查找到的那些值。这可能吗 function onFormSubmit(e) { var myRange = e.range; sendEmail(myRange); } function sendEmail(submitRange) { // FETCH SPREA

我有一个谷歌表格和工作表,我正在使用。当用户提交表单时,我在运行的工作表的OnFormSubmit中有代码。使用他们提交的ID,我可以在该表的第二个选项卡中查找数据,并通过电子邮件发送给某人

我想添加我在回复表中查找到的那些值。这可能吗

function onFormSubmit(e) 
{

  var myRange = e.range;
  sendEmail(myRange);

}

function sendEmail(submitRange) {

  // FETCH SPREADSHEET VALUES//
  var values = submitRange.getValues();
  var row = values[0];

  //WRITE FOUND VALUES TO EMAIL
  var svTimeStamp = row[0];  //A
  var svProjectManager = row[4]; //Update manually  //E
  var svClient = row[5]; //Update manually  //F

  //PREP LOOKUP VALUE SHEET
  var mySpreadSheetFile = SpreadsheetApp.openById('--SheetId---');
  var myLookupsTab = mySpreadSheetFile.getSheetByName("KMB Lookups");


  //In Column 6 find value for Project Number
  var projColumn = 6;
  var projectNumbers = myLookupsTab.getRange(2, projColumn, myLookupsTab.getLastRow()).getValues(); //1st is header row
  var rowIndex = projectNumbers.findIndex(svProjectID); //Row Index - 2

  //Get value for column 7
  var clntColumn = 7;
  var clntRange = myLookupsTab.getRange(rowIndex+2, clntColumn);
  var clntValue = clntRange.getValues();

  //I don't think I can update 'Values' from 'submitRange, so I open the sheet
  var myData = mySpreadSheetFile.getSheetByName("Form Responses 1");
  var newestData = myData.getRange(2, 1, myData.getLastRow()).getValues(); //1st is header row
  //FIND THE RECORD VIA MATCHING THE TIMESTAMP
  var rowNewDataIndex = newestData.findIndex(svTimeStamp); //Row Index - 2
  //UPDATE THE SHEET @ Rowindex, column 5
  myData.getRange(rowNewDataIndex+2, 5).setValue(clntValue);
我希望用查找值更新单元格。rowNewDataIndex的值每次为-14。我想这一行还没写出来

编辑:我认为问题在于格式不匹配:

RANGE: Mon Oct 21 2019 15:24:00 GMT-0400 (EDT)
SHEET: Mon Oct 21 16:07:52 GMT-04:00 2019
这看起来可能有效:

var formattedDate = Utilities.formatDate(svTimeStamp, Session.getScriptTimeZone(), 'E MMM dd k:mm:ss zZ yyyy');
formattedDate = formattedDate.toString().replace("EDT","GMT");
formattedDate = formattedDate.toString().replace("-0500","-05:00");
formattedDate = formattedDate.toString().replace("-0400","-04:00");

然后我可以在现有的电子表格中搜索该值。

这是我的净化代码。我可以通过将范围发送到数组来匹配日期。算了吧

function onFormSubmit(e) 
{
  var myRange = e.range;
  sendEmail(myRange);
}

function sendEmail(submitRange) {

  // FETCH SPREADSHEET //
  var values = submitRange.getValues();
  var row = values[0];

  //WRITE FOUND VALUES TO EMAIL
  var svProjectManager = row[4]; //E
  var svClient = row[5]; //F

  // EXTRACT VALUES //
  var svTimeStamp = row[0];  //A
  var svInitials = row[1];  //B
  var svProjectID = row[2];  //C


  //LOOKUP KMB PROJECT NUMBER IN SHEET: "New - KMB Design Visit Closeout (Responses)" TAB: "KMB Lookups"
  var mySpreadSheetFile = SpreadsheetApp.openById('---Spreadsheet ID---');
  var myLookupsTab = mySpreadSheetFile.getSheetByName("KMB Lookups");

  //TODO - Need to code column numbers by looking for column-- column order may change.
  //In Column 5 'KMB Project ID' find record where value = svProjectID
  var projColumn = 5;
  var projectNumbers = myLookupsTab.getRange(2, projColumn, myLookupsTab.getLastRow()).getValues(); //1st is header row
  var rowIndex = projectNumbers.findIndex(svProjectID); //Row Index - 2

  //Get value for column named 'Client Assigning this Work' col 7
  var clntColumn = 7;
  var clntRange = myLookupsTab.getRange(rowIndex+2, clntColumn);
  var clntValue = clntRange.getValues();

  //Get value for column named 'Site Address'  col 28
  var addrColumn = 28;
  var addrRange = myLookupsTab.getRange(rowIndex+2, addrColumn);
  var addrValue = addrRange.getValues();

  //Get value for column named 'KMB Project Manager' col 11
  var pmgrColumn = 11; 
  var pmgrRange = myLookupsTab.getRange(rowIndex+2, pmgrColumn);
  var pmgrValue = pmgrRange.getValues();


  //GET SITETRACKER IDS AND WRITE TO SPREADSHEET
  console.log('Writing to spreadsheet');
  var IdColumn = 1; //Hearing Results
  var IDRange = myLookupsTab.getRange(rowIndex+2, IdColumn);
  var nameIdValue = IDRange.getValues();
  console.log(nameIdValue);

  IdColumn = 2; 
  var IDRange = myLookupsTab.getRange(rowIndex+2, IdColumn);
  var IdSiteNameValue = IDRange.getValues();
  console.log(IdSiteNameValue);

  IdColumn = 3; 
  var IDRange = myLookupsTab.getRange(rowIndex+2, IdColumn);
  var IdProjectIDValue = IDRange.getValues();
  console.log(IdProjectIDValue);

  console.log('Form Timestamp: '+svTimeStamp);


      //Update myData where field TimeStamp = svTimeStamp.  Set Name Id, Id Site Name, & Id Project Id  [FUZZLE]
  var myData = mySpreadSheetFile.getSheetByName("Form Responses 1");
  var newestData = myData.getRange(2, 1, myData.getLastRow()).getValues().toString(); //This is the TimeStamp column values without header
  newestData = newestData.split(",");
  console.log(newestData);
  var rowNewDataIndex = newestData.findIndex(svTimeStamp); //Row Index - 2
  console.log('Row to update = '+rowNewDataIndex);

  myData.getRange(rowNewDataIndex+2, 33).setValue(nameIdValue);
  myData.getRange(rowNewDataIndex+2, 34).setValue(IdSiteNameValue);
  myData.getRange(rowNewDataIndex+2, 35).setValue(IdProjectIDValue);


  var svSiteAddress = addrValue;  //D
  var svProjectManager = pmgrValue; //E
  var svClient = clntValue;  //F

  var svNOCNeeded = row[6];  //G
  var svNOCInCode = row[7];  //H
  var svNOCOutCode = row[8];  //I
  var svPurpose = row[9];  //J
  var svDVStatus = row[10];  //K
  var svWhyIncompleteDV = row[11];  //L
  var svFDNYReq = row[12];  //M
  var svFDNYStatus = row[13];  //N
  var svFDNYWhyNot = row[14];  //O
  var svLPCNeeded = row[15];  //P
  var svLPCStatusPhotos = row[16];  //Q
  var svLPCStatusRevisit = row[17];  //R
  var svDesignRevisitNeeded = row[18];  //S
  var svWhyRevisitPROBE = row[19];  //T
  var svWhyRevisitSTRUCT = row[20];  //U
  var svWhyRevisitELEC = row[21];  //V
  var svWhyRevisitPLUM = row[22];  //W
  var svWhyRevisitWIRE = row[23];  //X
  var svWhyRevisitOTHER = row[24];  //Y
  var svStructuralReview = row[25];  //Z
  var svStructuralReviewWhy = row[26];  //AA
  var svVisitComplete = row[27];  //AB
  var svWhyIncompleteSV = row[28];  //AC
  var svProvideAccessInfo = row[29];  //AD
  var svComments = row[30];  //AE
  var svHearingResults = row[31];  //AF

  // PREPARE EMAIL //
  var emailBody = "";  //Format using variables set

  //BUILD EMAIL BODY
  emailBody="<h3><u>Site Information</u></h3>"
  emailBody+="<p><strong>KMB Project Number:&nbsp;</strong>"+svProjectID+"</p>";
  emailBody+="<p><strong>Site Address:&nbsp;</strong>"+svSiteAddress+"</p>";
  emailBody+="<p><strong>Project Manager:&nbsp;</strong>"+svProjectManager+"</p>";
  emailBody+="<p><strong>Client Assigning Work:&nbsp;</strong>"+svClient+"</p>";
  emailBody+="<p><strong>Design Visit Type:&nbsp;</strong>"+svPurpose+"</p>";
  emailBody+="<p>&nbsp;</p>";

  //NOC SECTION
  if (svNOCNeeded == "Yes")
  {
    emailBody+="<h3><u>NOC Code Entry</u></h3>";
    emailBody+="<p>NOC In Code:&nbsp;"+svNOCInCode+"</p>";
    emailBody+="<p>NOC Out Code:&nbsp;"+svNOCOutCode+"</p>";
    emailBody+="<p>&nbsp;</p>";
  }

  //DESIGN VISIT STATUS SECTION
  if (svPurpose == "Design Visit")
  {
    emailBody+="<h3><u>Design Visit Status</u></h3>";
    emailBody+="<p>"+svDVStatus+"</p>";

    if(svDVStatus == "Not Completed")
    {
      emailBody+="<p>Reason: "+svWhyIncompleteDV+"</p>";
    }
    emailBody+="<p>&nbsp;</p>";
  }

  //FDNY SECTION
  if (svFDNYReq != "")
  {
    emailBody+="<h3><u>FDNY</u></h3>";
    emailBody+="<p>Required:&nbsp;"+svFDNYReq+"</p>";

    if(svFDNYReq == "Required")
    {
      emailBody+="<p>Info Status Gathering:&nbsp;"+svFDNYStatus+"</p>";
    }
    else
    {
      emailBody+="<p>Reason:&nbsp;"+svFDNYWhyNot+"</p>";
    }
    emailBody+="<p>&nbsp;</p>";
  }

  //LPC SECTION
  if (svLPCNeeded != "")
  {
    emailBody+="<h3><u>LPC&nbsp;</u></h3>";
    emailBody+="<p>Needed:&nbsp;"+svLPCNeeded+"</p>";
    if (svLPCNeeded == "Yes")
    {
      emailBody+="<h4>Status</h4>";
      emailBody+="<p>LPC Photos Taken:&nbsp;"+svLPCStatusPhotos+"</p>";
      emailBody+="<p>Revisit Needed:&nbsp;"+svLPCStatusRevisit+"</p>";
    }
    emailBody+="<p>&nbsp;</p>";
  }

  //DESIGN REVISIT NEEDED SECTION
  if (svDesignRevisitNeeded == "Yes")
  {
    emailBody+="<h3><u>Design Revisit Needed</u></h3>";
    emailBody+="<p>Probe:&nbsp;"+svWhyRevisitPROBE+"</p>";
    emailBody+="<p>Structural Revisit:&nbsp;"+svWhyRevisitSTRUCT+"</p>";
    emailBody+="<p>Electrical Revisit:&nbsp;"+svWhyRevisitELEC+"</p>";
    emailBody+="<p>Plumbing Revisit:&nbsp;"+svWhyRevisitPLUM+"</p>";
    emailBody+="<p>Wireless Revisit:&nbsp;"+svWhyRevisitWIRE+"</p>";
    emailBody+="<p>Other:&nbsp;"+svWhyRevisitOTHER+"</p>";
    emailBody+="<p>&nbsp;</p>";
  }

  //STRUCTURAL REVIEW
  if (svStructuralReview == "Yes")
  {
    emailBody+="<h3><u>Structural Review</u></h3>";
    emailBody+="<p>Reason:&nbsp;"+svStructuralReviewWhy+"</p>";
    emailBody+="<p>&nbsp;</p>";
  }

  //VISIT COMPLETE
  if (svVisitComplete != "")
  {
    emailBody+="<h3><u>Visit Complete</u></h3>";
    emailBody+="<p>"+svVisitComplete+"";
    if (svVisitComplete == "No")
    {
      emailBody+="&nbsp;("+svWhyIncompleteSV+")";
    }
    emailBody+="</p><p>&nbsp;</p>";
  }
  //ACCESS INFO / COMMENTS SECTION
  emailBody+="<h3><u>Access Info and Comments</u></h3>";
  emailBody+="<p>Information Used to access this site:&nbsp;"+svProvideAccessInfo+"</p>";
  emailBody+="<p>General Design Visit Comments:&nbsp;"+svComments+"</p>";
  emailBody+="<p>&nbsp;</p>";

  //ZONING HEARING SECTION
  if (svPurpose == "Hearing")
  {
    emailBody+="<h3><u>Zoning Hearing Results</u></h3>";
    emailBody+="<p>"+svHearingResults+"</p>";
  }
  //Logger.Log(emailBody);
  var emailRecipients =   "user@comain.com";
  var emailSubject = "Field Visit Completed for "+svProjectManager+" "+svProjectID;

  // SEND EMAIL //
  MailApp.sendEmail(
    {
      name: svInitials,
      to: emailRecipients,
      subject: emailSubject,
      htmlBody: emailBody
    });
}

Array.prototype.findIndex = function(search)
{
  if(search == "") return false;
  for (var i=0; i<this.length; i++)
    if (this[i] == search) return i;

  return -1;
} 
函数onFormSubmit(e)
{
var myRange=e.range;
发送电子邮件(myRange);
}
发送电子邮件功能(submitRange){
//获取电子表格//
var values=submitRange.getValues();
var行=值[0];
//将找到的值写入电子邮件
var svProjectManager=行[4];//E
var svClient=行[5];//F
//提取值//
var svTimeStamp=行[0];//A
var svInitials=行[1];//B
var svprojectd=行[2];//C
//在表格中查找九巴项目编号:“新建-九巴设计访问收尾(响应)”选项卡:“九巴查找”
var mySpreadSheetFile=SpreadsheetApp.openById('--spreadsheetid--');
var myLookupsTab=mySpreadSheetFile.getSheetByName(“KMB查找”);
//TODO—需要通过查找列来对列编号进行编码—列顺序可能会更改。
//在第5列“KMB项目ID”中查找记录,其中值=svProjectID
var projColumn=5;
var projectNumbers=myLookupsTab.getRange(2,projColumn,myLookupsTab.getLastRow()).getValues();//第一行是标题行
var rowIndex=projectNumbers.findIndex(svProjectID);//行索引-2
//获取名为“客户端分配此工作”列7的值
var-clntColumn=7;
var clntRange=myLookupsTab.getRange(行索引+2,clntColumn);
var clntValue=clntRange.getValues();
//获取名为“站点地址”列第28列的值
var addrColumn=28;
var addrRange=myLookupsTab.getRange(行索引+2,addrColumn);
var addrValue=addrRange.getValues();
//获取名为“KMB项目经理”列11的值
var pmgrColumn=11;
var pmgrRange=myLookupsTab.getRange(行索引+2,pmgrColumn);
var pmgrValue=pmgrRange.getValues();
//获取SITETRACKER ID并写入电子表格
console.log(“写入电子表格”);
var IdColumn=1;//听取结果
var IDRange=myLookupsTab.getRange(行索引+2,IdColumn);
var nameIdValue=IDRange.getValues();
console.log(nameIdValue);
IdColumn=2;
var IDRange=myLookupsTab.getRange(行索引+2,IdColumn);
var IdSiteNameValue=IDRange.getValues();
console.log(IdSiteNameValue);
IdColumn=3;
var IDRange=myLookupsTab.getRange(行索引+2,IdColumn);
var idprojectdvalue=IDRange.getValues();
console.log(idprojectdvalue);
log('formtimestamp:'+svTimeStamp);
//更新myData,其中字段TimeStamp=svTimeStamp。设置名称Id、Id站点名称和Id项目Id[FUZZLE]
var myData=myPreadSheetFile.getSheetByName(“表单响应1”);
var newestData=myData.getRange(2,1,myData.getLastRow()).getValues().toString();//这是不带标题的时间戳列值
newestData=newestData.split(“,”);
console.log(newestData);
var rowNewDataIndex=newestData.findIndex(svTimeStamp);//行索引-2
log('Row to update='+rowNewDataIndex);
getRange(rowNewDataIndex+2,33).setValue(nameIdValue);
getRange(rowNewDataIndex+2,34).setValue(IdSiteNameValue);
getRange(rowNewDataIndex+2,35).setValue(IdProjectdValue);
var svSiteAddress=addrValue;//D
var svProjectManager=pmgrValue;//E
var svClient=clntValue;//F
var svnoc=row[6];//G
var svNOCInCode=行[7];//H
var svNOCOutCode=行[8];//I
var svPurpose=行[9];//J
var svDVStatus=行[10];//K
var svwhyinpletedv=行[11];//L
var svFDNYReq=行[12];//M
var svFDNYStatus=行[13];//N
var svFDNYWhyNot=行[14];//O
var svlpcneeed=行[15];//P
var svLPCStatusPhotos=行[16];//Q
var svlpcstatusretain=行[17];//R
var svdesign=row[18];//S
var svWhyRevisitPROBE=行[19];//T
var svWhyRevisitSTRUCT=行[20];//U
var svWhyRevisitELEC=行[21];//V
var svWhyRevisitPLUM=行[22];//W
var svWhyRevisitWIRE=行[23];//X
var svWhyRevisitOTHER=行[24];//Y
var svStructuralReview=行[25];//Z
var svStructuralReviewWhy=行[26];//AA
var svVisitComplete=行[27];//AB
var svwhyinpletesv=行[28];//AC
var svprovidedAccessinfo=行[29];//AD
var svComments=行[30];//AE
var svHearingResults=行[31];//AF
//准备电子邮件//
var emailBody=”“;//使用变量集设置格式
//构建电子邮件正文
emailBody=“站点信息”
emailBody+=“九巴项目编号:”+svProjectID+“

”; emailBody+=“站点地址:”+svSiteAddress+“

”; emailBody+=“项目经理:”+svProjectManager+“

”; emailBody+=“客户端分配工作:”+svClient+“

”; emailBody+=“设计访问类型:”+svPurpose+“

”; emailBody+=“

”; //国家奥委会部分 如果(SVNOCENDED==“是”) { emailBody+=“NOC代码输入”; emailBody+=“代码中的NOC:“+svNOCInCode+”

”; emailBody+=“NOC输出代码:”+svNOCOutCode+“

”; emailBody+=“

”; } //设计访问状态组 if(svPurpose==“设计访问”) { emailBody+=“设计访问状态”; emailBody+=“”+svDVStatus+”

”; 如果(svDVStatus==“未完成”) { emailBody+=“原因:“+svwhyicompletedv+”

”; } emailBody+=“

”; } //FDNY部分 如果(svFDNYReq!=“”) {