首页 > 解决方案 > Google 表格脚本:TypeError:getValues 不是函数

问题描述

我创建了一个 vlookup 函数来检索命名范围中的值,因为它是在工作表中使用起来相当复杂的方程式的一部分。它的结构与本机 VLOOKUP 相同,但我只将它用于命名范围。

运行测试时出现“TypeError:range.getValues 不是函数”,但无法确定原因。任何意见,将不胜感激。MTIA

function c_test(){
  var result = c_VLookup(25, "Foil_Cant_Values", 2);  
  Logger.log("c_VLookup returned: " + result);
}

function c_VLookup(searchKey, NamedRange, index) {
// Author: Max Hugen
// Date: 20102-11-21
// Purpose: Script version of sheets VLOOKUP(search_key, range, index)

  var range = c_GetRangeByName(NamedRange);
    if (!range) { 
      Logger.log("c_VLookup didn't return a range.");
      return;
    }
  Logger.log("c_VLookup range: " + range);
  //Logger returned: c_VLookup range: A160:E162

  //TypeError: range.getValues is not a function (line 26, file "Utils")
  var data = range.getValues();

  var resultRow = data.filter( function(row) { row[1] = searchKey; });
  var result = resultRow[index];
  return result;
}

function c_GetRangeByName(NamedRange) {
SpreadsheetApp.getActiveSpreadsheet().getRangeByName(NamedRange).getA1Notation();
}

标签: google-apps-scriptgoogle-sheets

解决方案


在您的脚本中c_GetRangeByNamegetA1Notation()使用了 , 并且不返回任何值。我认为这是您的问题的原因。所以请修改如下。

修改后的脚本:

function c_GetRangeByName(NamedRange) {
  return SpreadsheetApp.getActiveSpreadsheet().getRangeByName(NamedRange);
}

此外,您filter需要进行如下修改。

var resultRow = data.filter( function(row) { return row[1] == searchKey; });

笔记:

  • 如果要查看 A1Notation at Logger.log("c_VLookup range: " + range);,请将其修改为Logger.log("c_VLookup range: " + range.getA1Notation());
  • 作为附加信息,在您的脚本中,当单元格“B160:B162”的值为 时25,将返回第 162 行的值。虽然我不确定您的实际情况,但请注意这一点。

参考:


推荐阅读