2014-03-31 59 views
0

我有工作就好了第一,如果我把它只有一次,但是当我反复调用它内部的for循环中,我得到以下错误的函数:错误调用函数第二次

类型错误:getNamedRange是不是一个函数,它是字符串。

对此错误进行搜索可以让我知道这是一个javascript错误,而不是Google Apps脚本错误。我没有用javascript工作太多,但我怀疑它可能与我如何从函数返回值有关。

这是调用该函数的代码:

var ss = SpreadsheetApp.getActiveSpreadsheet(); 
var baseSheet = ss.getSheetByName("Base"); 

var catCol = 9; 
var riskAreaColumn = 10; 

var numRows = baseSheet.getDataRange().getNumRows(); 

// I am not using this var, should I be? 
var data = baseSheet.getDataRange().getValues(); 

var cell; 
var rangeName; 
var range; 
var rule; 

for(var i=2; i<numRows; i++){ 

    cell = baseSheet.getRange(i, riskAreaColumn); 

    rangeName = getNamedRange("CategoryRiskRange",baseSheet.getRange(i, catCol).getValue()); 

    range = SpreadsheetApp.getActiveSpreadsheet().getRangeByName(rangeName); 

    rule = SpreadsheetApp.newDataValidation().requireValueInRange(range).build(); 

    cell.setDataValidation(rule); 

    } 

    SpreadsheetApp.flush(); 
} 

这是被调用的函数:

function getNamedRange(categoryRange, category) { 

var categoryList = SpreadsheetApp.getActive().getRangeByName(categoryRange).getValues(); 
for (var i = 0; i < categoryList.length; i++) { 

    if (categoryList[i][0] == category) { 
    getNamedRange = categoryList[i][1]; 
    return getNamedRange; 
    } 
} 
} 

第一次通过for循环的作品,第二次给了我上述错误。感谢您阅读本文,我希望这很清楚。

回答

3

你在这里覆盖的函数定义:

getNamedRange = categoryList[i][1]; 

这将工作:直到它得到他们

if (categoryList[i][0] == category) { 
    return categoryList[i][1]; 
    } 
2

JavaScript不理解的事情,很高兴重新定义东西的时候你告诉它。

第一次通过,它看到

function getNamedRange(categoryRange, category) 

,并说: “哦,一个功能!太酷了!”但在功能,你也行

getNamedRange = categoryList[i][1]; 

和它说“哦,这样getNamedRange是另一回事了。好了,我很好这一点。”

重命名你的变量,你应该没问题。

+0

我很欣赏你对javascript背后逻辑的解释。其他语言也一样吗?我认为我借用了其他语言的语法,或者我只是补充了它的语法?无论如何,谢谢。 –

+0

Java和C++会抱怨重新分配*,因为它们被称为“强类型”。 Javascript和Python会很乐意让你做你所做的事情。只取决于语言。 *实际上,因为您必须在C++或Java中的函数内声明getNamedRange作为String,所以您可以避开重新分配,因为编译器会知道您指定的是哪个getNamedRange指向的位置以及你如何引用它。但你不能只是做getNamedRange = categoryList [i] [1];没有专门声明变量。 –

相关问题