如何在Google Apps脚本中定义全局变量

时间:2014-07-13 09:23:11

标签: google-apps-script google-sheets google-docs

我看到谷歌的大多数例子都是他们只使用一个巨大的脚本中的函数。

e.g。 https://developers.google.com/apps-script/quickstart/macros

但在我们的风格中,我们通常在单个命名空间下编写所有函数,例如

MyCompany = (MyCompany || {});
MyCompany.init = function () {
    Logger.log('init');  
};

function onOpen() {
    var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
    var menus = [{
        name: "Init",
        functionName: MyCompany.init
    }];
    spreadsheet.addMenu("Test", menus);
};

但是,当我运行上面的代码时,它会返回

"MyCompany is not defined."

如何解决?

6 个答案:

答案 0 :(得分:78)

您可能最好使用Properties Service,因为您可以将它们用作一种持久的全局变量。

点击'文件>项目属性>项目属性'设置键值,或者你可以使用

PropertiesService.getScriptProperties().setProperty('mykey', 'myvalue');

可以使用

检索数据

var myvalue = PropertiesService.getScriptProperties().getProperty('mykey');

答案 1 :(得分:3)

在GAS中,全局变量不是其他语言中的变量。它们不是常量,也不是所有例程中都有的变量。

我认为我可以使用全局变量来实现功能和效率之间的一致性。但是我在SO的一些人指出我错了。

全局变量将在每次执行脚本时进行评估,因此每次运行应用程序时都不会评估一次 全局变量可以在脚本中更改(因此它们不是偶然无法更改的常量),但在调用另一个脚本时将重新初始化。 使用全局变量也存在速度损失。如果在函数中使用相同的全局变量两次或更多次,则分配局部变量并使用它更快。

如果要在应用程序中的所有函数之间保留变量,可能最好使用cacheService。 我发现循环遍历驱动器上的所有文件和文件夹需要很多时间。但是,您可以在缓存(甚至属性)中存储有关文件和文件夹的信息,并至少加速100次。

现在我使用全局变量的唯一方法是使用一些前缀和命名小部件。

答案 2 :(得分:2)

全局变量肯定存在于GAS中,但您必须了解环境的客户端/服务器关系才能正确使用它们 - 请参阅此问题: Global variables in Google Script (spreadsheet)

然而,这不是您的代码的问题;文档表明菜单要执行的功能必须作为字符串提供给方法,现在您正在提供函数的输出: https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet#addMenu%28String,Object%29

function MainMenu_Init() {
    Logger.log('init');  
};

function onOpen() {
    var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
    var menus = [{
        name: "Init",
        functionName: "MainMenu_Init"
    }];
    spreadsheet.addMenu("Test", menus);
};

答案 3 :(得分:0)

我用这个:如果您声明var x = 0;在函数声明之前,该变量适用于所有代码文件,但是每次您在电子表格中编辑单元格时都会声明该变量

答案 4 :(得分:0)

    var userProperties = PropertiesService.getUserProperties();


function globalSetting(){
  //creating an array
  userProperties.setProperty('gemployeeName',"Rajendra Barge");
  userProperties.setProperty('gemployeeMobile',"9822082320");
  userProperties.setProperty('gemployeeEmail'," rajbarge@hotmail.com");
  userProperties.setProperty('gemployeeLastlogin',"03/10/2020");
  
  
  
}


var userProperties = PropertiesService.getUserProperties();
function showUserForm(){

  var templete = HtmlService.createTemplateFromFile("userForm");
  
  var html = templete.evaluate();
  html.setTitle("Customer Data");
  SpreadsheetApp.getUi().showSidebar(html);


}

function appendData(data){
 globalSetting();
 
  var ws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Data");
  ws.appendRow([data.date,
                data.name,
                data.Kindlyattention,
                data.senderName,
                data.customereMail,
                userProperties.getProperty('gemployeeName'),
                ,
                ,
                data.paymentTerms,
                ,
                userProperties.getProperty('gemployeeMobile'),
                userProperties.getProperty('gemployeeEmail'),
                Utilities.formatDate(new Date(), "GMT+05:30", "dd-MM-yyyy HH:mm:ss")
                
                
  ]);
  
}

function errorMessage(){

Browser.msgBox("! All fields are mandetory");

}

答案 5 :(得分:-1)

我通过返回一个带有全局变量对象的函数来使用变通方法:

function globalVariables(){
  sheetName: 'Sheet1',    
  variable1: 1,
  varibale2: 2
}

function functionThatUsesVariable (){
  var sheet =   SpreadsheetApp.getActiveSpreadsheet().getSheetByName(globalVariables().sheetName);
}