我有一个包含需要验证的报告数据的 Google 表格。我创建了一个用户表单(Validation_1 选项卡)来提取报告数据以便于阅读。在用户表单上,数据根据源系统进行验证,以确保根据预设规范提取正确的值。当数据经过验证时,E 列中的下拉菜单用于输入评论,例如“同意、不同意等”。报告中的每个记录/案例都有一个唯一的 ID,该 ID 位于用户表单的单元格 C2 中。
根据在“数据”选项卡的“A”列中查找唯一 ID,我设法编写脚本将 E 列信息保存到“数据”选项卡。为此,我必须将 ID 预先加载到“数据”选项卡中。 如果对记录进行更改,我希望能够更新“数据”选项卡,或者如果“数据”选项卡上不存在 ID,我希望能够将数据附加到新行。
我当前的代码已定义 const 以包含 E 列中的非连续单元格。
const ss = SpreadsheetApp.getActiveSpreadsheet()
const dataWS = ss.getSheetByName("Data")
const updatesourceRangeE = ["C5","E6","E7","E9","E11","E13"]
const formWS = ss.getSheetByName("Validation_1")
const idCell = formWS.getRange("c2")
const id = idCell.getValue()
function saveData(){
const idFound = dataWS.getRange("A:A").createTextFinder(id).matchEntireCell(true).findNext()
const idRow = idFound.getRow()
const colEdata = updatesourchRangeE.map(f =>
formWS.getRange(f).getValue())
colEdata.unshift(id)
dataWS.getRange(idRow,1,1,colEdata.length).setValues([colEdata])
}
我尝试修改此网站和其他网站上找到的不同代码,但我没有足够的理解来将它们集成到我当前的代码中。任何帮助将不胜感激
编辑:进一步解释...
验证选项卡(源表)示例
|---|A-Empty col|B-Report headers|C-Report Info|D-Empty Col|E-User Input|
|:-:|:----------|:--------------:|:-----------:|:---------:|:----------:|
|1 | | | | | |
|2 | | Unique ID: |12345 | | |
|3 | | | | | |
|4 | | Demographics |Report data | | Comment |
|5 | | Name: |John Doe | | Agree |
|6 | | Date of Bith: |9/15/64 | | Disagree incorrect year|
|7 | | Insurance ID: | R8384958 | | Agree |
|8 | | | | | |
|9 | | Arrival date: | 8/1/24 | | Agree |
|10 | | | | | |
|11 | | Procedure date:| 8/3/24 | | UTD - record not available|
|12 | | | | | |
|13 | | Depart date: | 8/5/24 | | Agree |
数据选项卡(目标表)示例
|---| A |B |C |D |E |F |G |
|:-:|:--------:|:------:|:------:|:------:|:-------:|:-----:|:-----:|
|1 |Unique ID | Name | DOB |Insur ID|Arrival |Proc |Depart |
|2 | 12345 |John Doe| Agree |Disagree incorrect year|Agree|Agree|UTD-record not available|Agree|
|3 | 67890 |Nancy |Agree |Agree |Agree |Agree |Agree|
|4 | 13579 | | | | | | |
|5 | 24680 | | | | | | |
|6 | | | | | | | |
|7 | | | | | | | |
当前状态:如果唯一 ID 已在目标选项卡的 A 列中,则上述编码将写入目标页面。这是我想要的一部分。
我想要添加到代码中的是:
能够将新的唯一 ID (ABCDE) 添加到目标工作表中尚未列出的源工作表单元格 C2,完成表单并“保存”。该操作将在目标工作表(数据)上搜索新 ID (ABCDE),如果未找到,则会将信息附加到下一个可用行。在此示例中,它将填充第 6 行、A-G 列。
您有两张表“Validation_1”和“Data”。
一个关键功能是唯一 ID,它包含在“验证”表和“数据”表中
当用户完成报表验证后,您希望将数据更新为“数据”上相应的UniqueID。如果在“数据”上找不到 UniqueID,您需要在“数据”上添加一个新行,其中包含“验证”表中的所有信息。
考虑这个答案:
自定义菜单启动
updateData
功能。indexOf
返回-1),一条新记录将附加到“数据”表当找到唯一 ID /**
* The event handler triggered when opening the spreadsheet.
* @param {Event} e The onOpen event.
* @see https://developers.google.com/apps-script/guides/triggers#onopene
*/
function onOpen(e) {
// Add a custom menu to the spreadsheet.
SpreadsheetApp.getUi()
.createMenu('Custom Menu')
.addItem('Update Data sheet', 'updateData')
.addToUi();
}
function updateData() {
var ss = SpreadsheetApp.getActiveSpreadsheet()
var valSheet = ss.getSheetByName("Validation_1")
// get UniqueID and name
var uId = valSheet.getRange("C2").getValue()
Logger.log("DBUG: The Report unique ID = "+uId)
if (uId.length <1){
Logger.log("DEBUG: Unique ID is blank")
// script stopped
// do something to warn user, for example
/*
// Display a prompt box to user
var ui = SpreadsheetApp.getUi();
var response = ui.alert('Processing error: Unique ID is Blank', 'Processing halted', ui.ButtonSet.OK);
*/
return
}
// get the name
var name = valSheet.getRange("C5").getValue()
Logger.log("DEBUG: the Report name = "+name)
if (name.length <1){
Logger.log("DEBUGL The name is blank")
// script stopped
// do something to warn user
return
}
// get the Comments
var comments = valSheet.getRange("E5:E13").getValues()
// delete blanks
// How to remove empty arrays from multidimensional array in JavaScript?
// https://stackoverflow.com/a/65784769/1330560
// @LogiStack
var filteredComments = comments.filter(function (x) {
return !(x.every(element => element === (undefined || null || '')))
})
Logger.log("DEBUG: the number of Comments = "+filteredComments.length)
if(filteredComments.length != 6){
Logger.log("Insufficient comments")
// script stopped
// do something to warn user
return
}
// flatten the comments to 1D array
filteredComments = filteredComments.flat()
Logger.log(filteredComments) // DEBUG
// find a match for the Unique ID on Data
// get the IDs
var dataSheet = ss.getSheetByName("Data")
// get the number of rows in Column A
var dataAVals = dataSheet.getRange("A2:A").getValues()
var dataALast = dataAVals.filter(String).length
var dataIDList = dataSheet.getRange(2,1,dataALast,1).getValues().flat()
Logger.log(dataIDList) // DEBUG
// find the UniqueId in the data List
var idIndex = dataIDList.indexOf(uId)
Logger.log("DEBUG: the id index = "+idIndex)
if (idIndex == -1){
// if -1, then UID not founbd, so create new row
var tempArray1 = new Array
tempArray1.push(uId,name)
var tempArray2 = tempArray1.concat(filteredComments);
Logger.log(tempArray2) // DEBUG
// append the new row
dataSheet.appendRow(tempArray2);
return
}
// update an existing row
var dataUpdateRange = dataSheet.getRange((+idIndex+2),3,1,6)
Logger.log("DEBUG: the data range to update = "+dataUpdateRange.getA1Notation())
dataUpdateRange.setValues([filteredComments])
}
示例 - 验证 - 新 ID
示例 - 数据(之前)
示例-数据(更新后-现有ID)