【问题标题】:Google Apps Script compare ranges to find matchesGoogle Apps 脚本比较范围以查找匹配项
【发布时间】:2021-12-16 15:56:18
【问题描述】:

我有 2 张“客户(下表 1)”和“颜色说明(下表 2)”。我想使用 GAS 执行以下操作:

  1. onEdit 我想比较 2 个范围然后...
  2. 查找“Client Sheet - Col2”与“Color Description Sheet - Col1”匹配的每个实例
  3. 获取实例所在单元格的地址
  4. 在“客户表 - Col3(单元地址)”中设置该值

所需的输出如下所示: [约翰|红色 |颜色说明 A2] 或 [Beth |粉红色 |颜色说明 A7]

e 由电子表格上的多个事物触发

Client Color Cell Address
Jon red
Beth pink
Tom blue
Cj red
Omar green
Lisa Purple
Color Description
Red Something about Red
Green Something about Green
Blue Something about Blue
Purple Something about Purple
White Something about White
Pink Something about Pink

我希望这是有道理的。 TIA 为您提供帮助。

【问题讨论】:

  • 我认为流 2 到 3 可以通过 Google Apps Script 来实现。但是,我无法理解onEdit I want to compare 2 ranges then... 的流程1。我为我糟糕的英语水平道歉。可以问一下具体情况吗?
  • 您是否有理由希望使用脚本而不是简单的公式来完成此操作?单个 VLOOKUP 公式可以检索所有结果;并且由于您想要一个 onEdit 触发器(即,只要对工作表进行任何更改,就会发生这种获取),在我看来,结果与仅使用公式完全相同。那么为什么要走相对复杂的脚本路线呢?有什么我们没有看到的吗?
  • @ErikTyler 我的示例模拟了一个提取过滤数据的不同电子表格。我想为部分过滤数据添加超链接。过滤数据后,我将使用单元格地址在脚本中创建超链接。

标签: google-apps-script google-sheets google-sheets-formula array-formulas google-query-language


【解决方案1】:

我相信你的目标如下。

  • 您希望使用 Google Apps 脚本在问题中实现 1 到 4 的过程。

示例脚本:

在此示例脚本中,根据您的问题,使用了 ClientColor Description 的工作表名称。关于这一点,请根据您的实际情况进行修改。

function myFunction() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const client = ss.getSheetByName("Client");
  const colorDescription = ss.getSheetByName("Color Description");
  const obj = colorDescription.getRange("A2:B" + colorDescription.getLastRow()).getValues().reduce((o, [a, b]) => (o[a.toLowerCase()] = b, o), {});
  const values = client.getRange("B2:B" + client.getLastRow()).getValues().map(([b]) => [obj[b.toLowerCase()] || ""]);
  client.getRange(2, 3, values.length, 1).setValues(values);
}
  • 运行此脚本时,通过搜索Color 的值,将Color Description 表的“B”列的值放入Client 表的“C”列。

注意:

  • 在此示例脚本中,它假定每张工作表的第一行是您问题中示例工作表的标题行。
  • 我无法理解onEdit I want to compare 2 ranges then...onEdit。在我提出的脚本中,脚本可以通过脚本编辑器、按钮、自定义菜单等运行。但是如果你想使用 OnEdit 运行脚本,你能提供执行脚本的条件吗?借此,我想对其进行修改。

参考资料:

【讨论】:

    【解决方案2】:

    这就是我想出的。抱歉,如果这有点笨拙,因为我是新手。

    function myFunction() {
        var clientColors = SpreadsheetApp.getActiveSpreadsheet();
        var clientSheet = clientColors.getSheetByName("Client");
        var colorSheet = clientColors.getSheetByName("Color Description");
        var lastRownumberClient = clientSheet.getLastRow();
        var lastRownumberColor = colorSheet.getLastRow();
        var clientSheetVals = clientSheet.getRange(2,2,lastRownumberClient-1,1).getValues();//-1 to remove header row
        var colorSheetVals = colorSheet.getRange(2,1,lastRownumberColor-1,1).getValues();//-1 to remove header row
    
        var colorColA = clientSheetVals.map(function(row){//This maps out ColB in the client sheet and returns the matches from ColA in the color sheet
        var theItem = row[0];
        var  lookupColorRangeValues = colorSheetVals.map(function(row){return row[0];});            
        var index = lookupColorRangeValues.indexOf(theItem)+2;
          
        return ['A'+[index]]});//'A' concatenates the the column letter to the returned index number
     
     
     
     clientSheet.getRange(2,3,clientSheet.getLastRow()-1,1).setValues(colorColA);//Sets the returned values in ColC of the client sheet -1 to remove header row
    }
    

    【讨论】:

    • @Tyler2P 感谢格式改进
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多