我看到大多数来自Google的例子是他们只在一个巨大的脚本中使用函数。
。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."
如何解决?
您最好使用属性服务,因为您可以将它们用作一种持久的全局变量。
点击'file>项目属性>项目属性'设置键值,或者可以使用
PropertiesService.getScriptProperties().setProperty('mykey', 'myvalue');
可以使用
检索数据var myvalue = PropertiesService.getScriptProperties().getProperty('mykey');
在GAS中全局变量不像在其他语言中那样。它们不是在所有例程中可用的常量或变量。
我想我可以使用全局变量来保持函数和效率之间的一致性。但是我错了,正如一些人在SO指出的那样。
全局变量将在每次执行脚本时求值,所以不是每次运行应用程序都求值一次。
全局变量可以在脚本中更改(所以它们不是不能被意外更改的常量),但是在调用另一个脚本时将被重新初始化。
使用全局变量也有速度损失。如果在一个函数中使用同一个全局变量两次或两次以上,那么分配一个局部变量并使用它会更快。
如果你想在应用程序中的所有函数之间保留变量,那么使用cacheService可能是最好的。我发现遍历驱动器上的所有文件和文件夹要花很多时间。但是你可以将文件和文件夹的信息存储在缓存中(甚至属性),这样速度至少可以提高100倍。
我现在使用全局变量的唯一方法是用于一些前缀和命名小部件。
我正在使用一个解决方案,通过返回一个函数与我的全局变量的对象:
function globalVariables(){
var variables = {
sheetName: 'Sheet1',
variable1: 1,
variable2: 2
};
return variables;
}
function functionThatUsesVariable (){
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(globalVariables().sheetName);
}
全局变量在GAS中确实存在,但是为了正确使用它们,你必须理解环境的客户端/服务器关系——请看这个问题:Google Script(电子表格)中的全局变量
然而这不是你的代码的问题;文档指出,菜单要执行的函数必须以字符串的形式提供给方法,现在你正在提供函数的输出:https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet addMenu % 28字符串、对象% 29日
function MainMenu_Init() {
Logger.log('init');
};
function onOpen() {
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var menus = [{
name: "Init",
functionName: "MainMenu_Init"
}];
spreadsheet.addMenu("Test", menus);
};
我需要类似的问题,您可以存储并从缓存中获取https://developers.google.com/apps-script/reference/cache/cache
的例子:
// call cache service
var cache = CacheService.getScriptCache();
// get an item from the cache
var cached = cache.get("somekey");
// if exists in the cache use it
if (cached != null) {
// use it whatever you like.
}else{
// calculate/assign your data to cache
cache.put("somekey","somevalueorobject");
// you can even put cache data on TTL (time to live) in seconds.
cache.put("somekey","somevalueorobject",60);
我用这个:如果你声明var x = 0;在函数声明之前,变量适用于所有代码文件,但是每次在电子表格
对于常量,我使用函数箭头表达式。内存占用类似于变量声明。只需在声明时添加() =>
,在调用(函数)变量时添加()
。
var currentSheet = () => SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var maxAttempts = () => 10;
function myFunction(){
var sheetName = currentSheet().getName();
for (var i=0; i< maxAttempts(); i++){
trySomething(i);
}
}
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");
}