为什么我会收到“ReferenceError: test is not defined”

时间:2021-02-13 20:43:26

标签: javascript google-apps-script

在我的 Google Script 项目中,我得到了两个 GS 文件 Code.gsother.gs

code.gs 看起来像

var globalSettings = {};
settings();


function settings(){
  other();
  globalSettings.fileName = "file";
  console.log("settings was executed");
}

function primary(){

  console.log("primary was executed");
}

other.gs 看起来像

function other(){

  console.log("other was executed");
}

当我运行函数 primary 时,我得到

ReferenceError: other is not defined
settings    @ Code.gs:5
(anonymous) @ Code.gs:1

当我将函数 other 移动到文件 code 时,它可以工作。有人可以解释为什么吗?其他文件可以在项目中的任何地方吗?

1 个答案:

答案 0 :(得分:2)

说明:

每次调用函数(在项目的任何脚本中),全局变量都会自动执行

  • 这就是为什么如果将var globalSettings = {}定义为全局声明,每次在项目中运行任何函数时,都会执行所有全局调用,因此globalSettings将被设置为一个空对象,这就是我不使用全局变量的原因。

  • 全局调用 other函数声明 other 需要在同一个 gs 脚本中为了工作。或者您可以简单地从函数 othersettings 中调用 primary,这样 other 可以保留在单独的脚本中。

例如,这将工作得很好:

code.gs

// define global variables
var globalSettings = {};

// adjust global variables here as a helper function
function settings(){
  other();
  globalSettings.fileName = "file";
  console.log("settings was executed");
}

// main function to be executed
function primary(){
  settings(); // call settings
  console.log(globalSettings.fileName);
  console.log(globalSettings.date);
  console.log("primary was executed");
}

other.gs

// make additional adjustments to the global variables
function other(){
  globalSettings.date = "today";
  console.log("other was executed");
}

建议:

确保不执行全局声明的更好方法是使用 Class PropertiesService 类来存储一些脚本或用户数据,然后您可以全局或本地检索它们(在函数内部) ) 并且这将确保您不会在每次执行时意外执行它们,因为全局声明就是这种情况。