在一个单元格中查找 2 或 3 个姓名的匹配项,将这些匹配项输入到另一张纸上的相应单元格中?

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

这是我的表格。

主表 Q 列包含带有驱动程序名称的注释,通常会包含多个名称。 S 列是驱动程序名称所在的位置。我当前的公式只能找到一个名称,即使存在多个名称。我需要它来查找所有存在的名字并像这样输入:Kent、Kyle、Pitts。

DriversBusesEmojis 表栏我有长途汽车司机的姓氏列表。

我不知道该怎么做。最终,我希望这些长途汽车司机姓名出现在工作表 S 列中。如果我使用公式将它们直接放入该工作表/列中,我无法手动分配其他司机或对长途汽车司机进行更改。我的想法是,如果在不同的工作表上使用公式来获取我需要的列中所需的数据,那么当导入数据时(脚本已经进行导入),它将带来该名称,并且仍然可以编辑在工作表上。

脚本会是更好的选择吗?是否可以修改当前的导入脚本以包括查找名称并将其输入到适当的单元格中?
我对谷歌应用程序脚本也知之甚少。我得到了很多帮助,自己也明白了一些。所以我需要详细的解释如何做到这一点。导入脚本对于我的初学者来说很复杂,所以到目前为止我还无法弄清楚如何合并此功能。

注意:只要有可能,我都会将公式合并到标题中。例如,在主工作表列 S 上,标题单元格具有一个显示标题文本和公式的公式。这样,如果我更改排序/过滤等,我就不会丢失公式。

我也知道弄乱表单回复表不是一个好主意,但我希望这一件事不会在任何地方引起问题。如果有更好的建议请告诉我!

我尝试过各种配方解决方案。到目前为止我只能找到一个名字。

公式为:

=IFNA(BYROW(Master!$Q$2:$Q,LAMBDA(g,IF(g="",,INDEX(FILTER($I$2:$J,$I$2:$I<>"",REGEXMATCH(g,"(?i)"&$I$2:$I)),1,)))))
The result is pulled into the Master sheet column S with this formula:
={"Coach Driver";IMPORTRANGE("https://docs.google.com/spreadsheets/d/1jO8auzYZ6drlGi3m7lon6gHTBVboDNgH5e0x4OwQoAA/edit?gid=818123556#gid=818123556", "DriversBusesEmojis!L2:L")}
google-sheets google-apps-script google-sheets-formula
1个回答
0
投票

您有一个 Google 表单,用户可以在其中请求巴士。该表格包括一个“注释”字段,其中可以记录司机的姓名等。该表格链接到电子表格。

在同一个电子表格上,有一个司机姓名列表。

对于每个请求/提交,您希望使用驱动程序名称列表为每个提交创建一个新列,其中包含名称出现在“注释”中的以逗号分隔的驱动程序列表。

考虑这个脚本,它应该由可安装的

onFormSubmit
触发器触发。


    function getFormData(e) {
    
      // Logger.log(JSON.stringify(e)) // DEBUG
      
      // get  Event Objects 
      var values = e.values
      var editedRow = e.range.rowStart
      
      // number of questions in the form
      var itemCount = values.length
      // Logger.log("DEBUG: number of questions in response = "+itemCount)
      
      // copy the response to "Working" sheet
      var ss = SpreadsheetApp.getActiveSpreadsheet()
      var workingSheet = ss.getSheetByName("Working03")
      var targetRange = workingSheet.getRange(editedRow,1,1,itemCount)
      // Logger.log("DEBUG: the target range = "+targetRange.getA1Notation())
      targetRange.setValues([values])
    
      // get the Comments value as a String
      var driverComments = e.namedValues['Comments'].toString()
      // Logger.log("DEBUG: Driver comments = "+driverComments)
    
      // get the driver names from Column O = 15
      var driverSheet = ss.getSheetByName("DriversBusesEmojis")
      var driverCount = driverSheet.getRange("O2:O").getValues().filter(String).length
      // Logger.log("DEBUG: the number of drivers = "+driverCount)
      var driverList = driverSheet.getRange(2,15,driverCount,1).getValues().flat()
      // Logger.log(driverList) // DEBUG
    
      // create temp array to hold driver names from Comments
      var tempArray = new Array
    
      // loop through the driver list and test for inclusion in the comment
      for (var i=0;i<driverCount;i++){
        var result = driverComments.indexOf(driverList[i])
        // Logger.log("DEBUG: i:"+i+", drivername = "+driverList[i]+", result = "+result)
        if (result >1){
          tempArray.push(driverList[i])
        }
      }
      // Logger.log(tempArray) // DEBUG
    
      // join array values as a string
      var drivers = tempArray.join()
      // Logger.log(drivers) // DEBUG
    
      // set the output range on "Working"
      var targetRange = workingSheet.getRange(editedRow,(+itemCount+1))
      // Logger.log("DEBUG: the target range = "+targetRange.getA1Notation())
    
      // update the Drivers column on "Working"
      targetRange.setValue(drivers)

}

评论

  • 尽可能使用事件对象。
  • 每次提交都会被复制到“工作”表中,以便原始表单回复保持完整。
  • 循环用于处理驱动程序名称,indexOf(字符串版本)用于测试注释中的驱动程序名称。
  • 临时数组用于累积注释中找到的任何/所有驱动程序名称。
  • a join 用于将临时数组的内容转换为逗号分隔的字符串。
© www.soinside.com 2019 - 2024. All rights reserved.