代码之家  ›  专栏  ›  技术社区  ›  Jebra

将索引匹配谷歌表格公式转换为应用程序脚本[关闭]

  •  -2
  • Jebra  · 技术社区  · 1 年前

    我需要根据2列对匹配项进行索引,并设置 Data!I1:I 将值输入选项卡 N

    =arrayformula(iferror( vlookup( G1:G & H1:H,{Data!G1:G&Data!H1:H,Data!I1:I},2,false)))
    

    Worksheet Demo

    这个公式正在发挥作用,但我需要将其转换为谷歌应用程序脚本。

    我试过了,但我出了个错误。 searchRow 这不是一个功能。

    const mainData = ss.getSheetByName("Data");
    const tab = ss.getSheetByName("Tab");
    const searchValues = mainSS.getRange("G1:H").getValues();
    const targetMatch = tab.getRange("G1:H").getValues();                
    const matching = searchValues.map(searchRow =>{
    const matchRow = targetMatch.find(r => r[0] == searchRow([0]))
    return matchRow ? [matchRow([2])] : [null];
    })
    targetMatch.getRange("N1:N").setValues(matching);
    
    1 回复  |  直到 1 年前
        1
  •  1
  •   Tanaike    1 年前

    在你的情况下,以下修改怎么样?

    修改要点:

    • 在你的剧本中 const matchRow = targetMatch.find(r => r[0] == searchRow([0])) , searchRow([0]) 应该是 searchRow[0] 这就是你目前发行《 searchRow is not a function. .
    • 此外,at return matchRow ? [matchRow([2])] : [null]; , matchRow([2]) 应该是 matchRow[2] 但是 targetMatch 有2列 const targetMatch = tab.getRange("G1:H").getValues(); 。因此,在这种情况下,返回undefined。
    • 我想,在您的情况下,当在循环外创建用于搜索值的对象时,流程成本可能会降低。

    当这些点反映在脚本中时,以下修改如何?

    修改的脚本:

    function myFunction() {
      const sheetName1 = "Tab";
      const sheetName2 = "Data";
    
      // Retrieve sheets.
      const ss = SpreadsheetApp.getActiveSpreadsheet();
      const [sheet1, sheet2] = [sheetName1, sheetName2].map(s => ss.getSheetByName(s));
    
      // Retrieve values from both sheets.
      const lastRow1 = sheet1.getLastRow();
      const values1 = sheet1.getRange("G1:H" + lastRow1).getValues();
      const values2 = sheet2.getRange("G1:I" + sheet2.getLastRow()).getValues();
    
      // Create an object for searching.
      const obj2 = new Map(values2.map(([g, h, i]) => [`${g}${h}`, i]));
    
      // Create the result array.
      const res = values1.map(([g, h]) => [obj2.get(`${g}${h}`) || null]);
    
      // Put the result array to column "O" of "Tab" sheet as a sample.
      sheet1.getRange(`O1:O${lastRow1}`).setValues(res);
    }
    

    运行此脚本时,结果值将放入“O”列。因为您的电子表格在“N”列中有值。当您想将值放入“N”列时,请修改 sheet1.getRange(`O1:O${lastRow1}`).setValues(res); sheet1.getRange(`N1:N${lastRow1}`).setValues(res); .

    参考文献: