根据 ID 更新数据,如果 ID 不在列表中则追加新行

问题描述 投票:0回答:1

我有一个包含需要验证的报告数据的 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 列。

google-sheets google-apps-script append
1个回答
0
投票

您有两张表“Validation_1”和“Data”。

  • Validation_1 - 由报告创建,通过使用多个数据验证单元,使用户能够表达对报告数据的评论
  • 数据 - 更新已验证信息的表。

一个关键功能是唯一 ID,它包含在“验证”表和“数据”表中

当用户完成报表验证后,您希望将数据更新为“数据”上相应的UniqueID。如果在“数据”上找不到 UniqueID,您需要在“数据”上添加一个新行,其中包含“验证”表中的所有信息。

考虑这个答案:

  • 用户可以通过
    自定义菜单
    启动updateData功能。
  • 该脚本包含用于测试不完整信息的控件。如果信息不完整,则停止处理并发出警告/生成消息。 测试字段:唯一 ID、名称、6 x 评论
    • 给出了一个警报作为缺少唯一 ID 的示例。
    • 当不完整的测试失败时,OP 可以决定采取什么操作。
    从“数据”中提取的唯一信息是包含唯一 ID 的 A 列。
  • 使用
      indexOf
    • 针对“数据”测试唯一 ID 当UniqueID
    • 找不到
    • 时”(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 

validbefore

示例 - 验证 - 新 ID

validnew

示例 - 数据(之前)

databefore

示例-数据(更新后-现有ID)

dataexisting

示例 - 数据(更新后 - 新 ID)

datanew

© www.soinside.com 2019 - 2024. All rights reserved.