功能中定义的全局变量未定义?

时间:2014-10-14 03:44:30

标签: google-apps-script google-sheets

我正在为Google电子表格编写脚本,我想让整个脚本中的标题索引全局可用。

According to the theory,我应该能够在函数中定义全局变量。

function testFunc() {
testVar = 1;       // `testVar` is a Global variable now
}

在我的代码中,它看起来或多或少是这样的:

function getHeaders() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var data = sheet.getDataRange().getValues();
  var headers = data[0]

  headerIdIndex = headers.indexOf("ID")
  headerNameIndex = headers.indexOf("First-Last")
}

但是,稍后在我的代码中,当我调用变量headerNameIndex时,它似乎未定义:

function tellMeNames() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var data = sheet.getDataRange().getValues();
  for (var i = 1; i < data.length; i++) {
    Logger.log("Name: " + data[i][headerNameIndex])
  }
}

Reference Error

那么我做错了什么?感谢。

2 个答案:

答案 0 :(得分:1)

我找到了一个我认为的解决方案,但我不确定这是“正确”的方法。

我只是在脚本中定义上面的全局变量:

headerNameIndex = SpreadsheetApp.getActiveSheet().getDataRange().getValues()[0].indexOf("First-Last")

这似乎有用。

我错误地认为只有在onOpen()函数中定义它才会起作用。

答案 1 :(得分:1)

好吧,我正在浏览some relevant个关于在Google Apps脚本中定义全局变量的帖子,并且从this answer发现你无法更新处理函数内的全局变量即GAS中的全局变量是静态的。

现在,这取决于您的具体用例,但我假设您已经定义了一个函数getHeaders(),您需要不止一次地调用它。但是,如果情况并非如此,那么您可以简单地将所有函数范围之外的变量声明并初始化为全局变量,并在任何其他函数中读取它们。

所以你可能想在你的情况下尝试这样的事情(没有测试过以下代码):

 var sheet = SpreadsheetApp.getActiveSheet();
 var data = sheet.getDataRange().getValues();
 var headers = data[0]

 headerIdIndex = headers.indexOf("ID")
 headerNameIndex = headers.indexOf("First-Last")

 ....

 function tellMeNames() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var data = sheet.getDataRange().getValues();
 for (var i = 1; i < data.length; i++) {
  Logger.log("Name: " + data[i][headerNameIndex])
 }
}

但是,如果要在处理函数中存储和更新全局变量,可能需要尝试Script-DB。希望这能让你开始朝着正确的方向前进。