Google apps script 如何更新工作表中新提交的表单响应上的字段?
我有一个谷歌表格和工作表,我正在使用。当用户提交表单时,我在运行的工作表的OnFormSubmit中有代码。使用他们提交的ID,我可以在该表的第二个选项卡中查找数据,并通过电子邮件发送给某人 我想添加我在回复表中查找到的那些值。这可能吗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
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: </strong>"+svProjectID+"</p>";
emailBody+="<p><strong>Site Address: </strong>"+svSiteAddress+"</p>";
emailBody+="<p><strong>Project Manager: </strong>"+svProjectManager+"</p>";
emailBody+="<p><strong>Client Assigning Work: </strong>"+svClient+"</p>";
emailBody+="<p><strong>Design Visit Type: </strong>"+svPurpose+"</p>";
emailBody+="<p> </p>";
//NOC SECTION
if (svNOCNeeded == "Yes")
{
emailBody+="<h3><u>NOC Code Entry</u></h3>";
emailBody+="<p>NOC In Code: "+svNOCInCode+"</p>";
emailBody+="<p>NOC Out Code: "+svNOCOutCode+"</p>";
emailBody+="<p> </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> </p>";
}
//FDNY SECTION
if (svFDNYReq != "")
{
emailBody+="<h3><u>FDNY</u></h3>";
emailBody+="<p>Required: "+svFDNYReq+"</p>";
if(svFDNYReq == "Required")
{
emailBody+="<p>Info Status Gathering: "+svFDNYStatus+"</p>";
}
else
{
emailBody+="<p>Reason: "+svFDNYWhyNot+"</p>";
}
emailBody+="<p> </p>";
}
//LPC SECTION
if (svLPCNeeded != "")
{
emailBody+="<h3><u>LPC </u></h3>";
emailBody+="<p>Needed: "+svLPCNeeded+"</p>";
if (svLPCNeeded == "Yes")
{
emailBody+="<h4>Status</h4>";
emailBody+="<p>LPC Photos Taken: "+svLPCStatusPhotos+"</p>";
emailBody+="<p>Revisit Needed: "+svLPCStatusRevisit+"</p>";
}
emailBody+="<p> </p>";
}
//DESIGN REVISIT NEEDED SECTION
if (svDesignRevisitNeeded == "Yes")
{
emailBody+="<h3><u>Design Revisit Needed</u></h3>";
emailBody+="<p>Probe: "+svWhyRevisitPROBE+"</p>";
emailBody+="<p>Structural Revisit: "+svWhyRevisitSTRUCT+"</p>";
emailBody+="<p>Electrical Revisit: "+svWhyRevisitELEC+"</p>";
emailBody+="<p>Plumbing Revisit: "+svWhyRevisitPLUM+"</p>";
emailBody+="<p>Wireless Revisit: "+svWhyRevisitWIRE+"</p>";
emailBody+="<p>Other: "+svWhyRevisitOTHER+"</p>";
emailBody+="<p> </p>";
}
//STRUCTURAL REVIEW
if (svStructuralReview == "Yes")
{
emailBody+="<h3><u>Structural Review</u></h3>";
emailBody+="<p>Reason: "+svStructuralReviewWhy+"</p>";
emailBody+="<p> </p>";
}
//VISIT COMPLETE
if (svVisitComplete != "")
{
emailBody+="<h3><u>Visit Complete</u></h3>";
emailBody+="<p>"+svVisitComplete+"";
if (svVisitComplete == "No")
{
emailBody+=" ("+svWhyIncompleteSV+")";
}
emailBody+="</p><p> </p>";
}
//ACCESS INFO / COMMENTS SECTION
emailBody+="<h3><u>Access Info and Comments</u></h3>";
emailBody+="<p>Information Used to access this site: "+svProvideAccessInfo+"</p>";
emailBody+="<p>General Design Visit Comments: "+svComments+"</p>";
emailBody+="<p> </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!=“”)
{