【问题标题】:Google Spreadsheets function to get a cell from a range by row and col name谷歌电子表格函数通过行和列名从一个范围内获取一个单元格
【发布时间】:2015-06-12 17:35:17
【问题描述】:

我有一个范围

      idz01  idz04  ida02
foo     a      1      b
bar     c      3      8
baz     8      2      g

我想从这个范围内获取值,如下所示:

SOME_FUNCTION(rangeID, 'foo', 'idz04')

获取1等。或者理想情况下,获取单元格:

INDIRECT(SOME_FUNCTION(rangeID, 'foo', 'idz04'))

或类似的。

有这样的吗?可以使用GETPIVOTDATA() 吗?

编辑: 如果我能够获得result_range,我可以以某种方式使用LOOKUP

LOOKUP("foo", DataRange, 
    FIRST_COL(
        OFFSET(DataRange, 
            MATCH("idz04", FIRST_ROW(DataRange), 0)
        )
    )
)

只是,我没有FIRST_ROW()FIRST_COL()...也许FILTER() 可以帮忙?

【问题讨论】:

    标签: google-apps-script google-sheets google-spreadsheet-api


    【解决方案1】:

    试试这个,你只需要设置范围:

    =INDEX("Talbe",MATCH("foo","First Column",0),MATCH("idz04","First Row",0))
    

    例如,如果您的表格在 A1:D4 范围内,请使用:

    =INDEX(A1:D4,MATCH("foo",A:A,0),MATCH("idz04",1:1,0))
    

    你也可以使用命名范围


    要自动获取第一列和第一行,请使用以下公式:

    =INDEX(data,MATCH("foo",INDIRECT(CHAR(64+COLUMN(data))&":"&CHAR(64+COLUMN(data))),0),MATCH("idz04",INDIRECT(COLUMN(data)&":"&COLUMN(data)),0))
    

    要通过脚本执行此操作,请使用以下代码:

    function LOOKUPGRID(data, rowHeader, colHeader) {
      for (var i = 0; i<data.length;i++) {
        if (data[i][0] === rowHeader) {
          for (var j = 0; j<data[0].length;j++) {
            if (data[0][j] === colHeader) {
              return (data[i][j]);
            }
          }
        }
      }
      return (null)
    }
    

    然后您可以像这样在工作表中调用公式:

    =LOOKUPGRID(A1:D4,"foo","idz04")
    

    【讨论】:

    • 这很好。我还可以自动获取第一列和第一行吗?这样我就不必减去范围的偏移量:MATCH("z04",1:1,0)-1)
    • 知道了,看其他答案。
    【解决方案2】:

    为此,您可以使用 Google Apps 脚本编写自定义函数。查看此documentation 了解更多详情。

    您可以使用名称或 ID 访问电子表格并获取值的范围(在您的情况下为单元格)。

    希望有帮助!

    【讨论】:

      【解决方案3】:

      这里是:

      =INDEX(ObjednavkyData, 
         // Find the offset of "vesela01" in the 1st column
         MATCH("vesela01",
           OFFSET((ObjednavkyData),0,0,
              MAX(ARRAYFORMULA(ROW(ObjednavkyData)))  // Num of rows in the range
           , 1)
         ,0), 
         // Find the offset of "z03" in the 1st row
         MATCH("z03", 
           OFFSET(ObjednavkyData, 0 , 0, 1)  // First row
         , 0)) 
      

      不是很整洁:P
      另见Google Spreadsheets: How to get a first (Nth) row/column from a range? (built-in functions)

      【讨论】:

        【解决方案4】:

        尝试编写自己的函数...

        /**
         * Returns [Range] the cell value at coordinates determined by the values first row (colHeader) and first column (rowHeader) in given range.
         */ 
        function LOOKUP_GRID(range, colHeader, rowHeader){
          for(var col = range.getWidth()-1; col--; col  >= 0 )
            if(range.getCell(1, col).getValue() === colHeader)
              break;
          for(var row = range.getHeight()-1; row--; row  >= 0 )
            if(range.getCell(row, 1).getValue() === rowHeader)
              break;
        
          if(col === -1 || row === -1)
            return null;
          else
            return range.getCell(row, column)
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-03-22
          • 1970-01-01
          • 1970-01-01
          • 2019-02-06
          • 1970-01-01
          • 1970-01-01
          • 2013-02-11
          相关资源
          最近更新 更多