首页 > 解决方案 > 在 GAS 项目下跨多个脚本文件访问变量

问题描述

我有一个这样的项目:

测试项目

-- 代码.gs

-- 14885.gs

-- 23546.gs

我想创建一个变量并在“Code.gs”文件中设置它的值。然后我应该可以在 14885.gs 和 23456.gs 文件中访问它。

在 Code.gs 文件中,我使用了 PropertiesServices 并创建了一个我想在项目下的其他“gs”文件中访问的变量。

在 Code.gs 文件中


function onEdit(e){  
   totalHoursLoggedForStory_today =  Number(e.range.getSheet().getRange("H3").getValue()) + Number(e.range.getSheet().getRange("H4").getValue()) + Number(e.range.getSheet().getRange("H5").getValue()); 

  var userProperties = PropertiesService.getUserProperties();
  var newProperties = {'hoursLogged': totalHoursLoggedForStory_today };
  userProperties.setProperties(newProperties); 

  onEditOfH3(e);
} 

在 23546.gs 文件中


  function onEditOfH3(e){   
   if (e.range.getA1Notation() == "H3") 
    { 
    var temp= userProperties.getProperty('hoursLogged'); 
    sh.alert(temp);
    }

预期:在 23546.gs 文件中,我应该能够提醒我在“Code.gs”文件中设置的属性。

实际:我看到此错误:ReferenceError: userProperties is not defined

标签: google-apps-script

解决方案


  • 您想使用在运行时的函数userProperties中给出的值。onEditonEditOfH3onEdit
  • 您想了解一个 GAS 项目中的文件规范。

如果我的理解是正确的,这个答案怎么样?请认为这只是几个答案之一。

关于一个 GAS 项目中的所有文件:

在 Google Apps Script 项目中,项目中的所有文件都作为一个项目使用。即,例如,当在 的文件中运行以下示例脚本时Code.gs

function myFunction() {
  for (var i in this) {
    if (typeof this[i] == "function") {
      Logger.log(i)
    }
  }
}

返回项目中所有文件中的所有函数。由此可知,在 的文件中声明全局变量时Code.gs,该变量可以在同一个项目的其他文件中使用。在以下模式 1 中,使用了它。

模式一:

在这种模式中,userProperties被声明为全局变量。

修改后的脚本:

代码.gs
var userProperties; // This is declared as the global variable.

function onEdit(e){
  totalHoursLoggedForStory_today =  Number(e.range.getSheet().getRange("H3").getValue()) + Number(e.range.getSheet().getRange("H4").getValue()) + Number(e.range.getSheet().getRange("H5").getValue());

  userProperties = PropertiesService.getUserProperties(); // Modified
  var newProperties = {'hoursLogged': totalHoursLoggedForStory_today };
  userProperties.setProperties(newProperties); 

  onEditOfH3(e);
}
23546.gs

这不需要修改。

模式二:

在此模式中,userProperties被添加到 的对象中e。并且该值用作e.userProperties的函数onEditOfH3。如果你不想使用全局变量,这个怎么样?此外,userProperties可以作为另一个参数发送。

修改后的脚本:

代码.gs
function onEdit(e){
  totalHoursLoggedForStory_today =  Number(e.range.getSheet().getRange("H3").getValue()) + Number(e.range.getSheet().getRange("H4").getValue()) + Number(e.range.getSheet().getRange("H5").getValue());

  var userProperties = PropertiesService.getUserProperties();
  var newProperties = {'hoursLogged': totalHoursLoggedForStory_today };
  userProperties.setProperties(newProperties);
  e.userProperties = userProperties; // Added
  onEditOfH3(e);
} 
23546.gs
function onEditOfH3(e){
  // var sh = SpreadsheetApp.getUi(); // In your whole script, this might be declared at elsewhere.
  if (e.range.getA1Notation() == "H3") { 
    var temp = e.userProperties.getProperty('hoursLogged'); // Modified
    sh.alert(temp);
  }
}

参考:


推荐阅读