我对那些在编程中有关于无状态和有状态设计的具体信息的文章很感兴趣.我很感兴趣,因为我想了解更多,但我真的找不到任何关于它的好文章.我已经阅读了几十篇关于网络的文章,这些文章模糊地讨论了这个主题,或者他们谈论的是网络服务器和会话 - 这也是'有状态与无国籍的关系,但我对无状态与编码属性的有状态设计感兴趣.示例:我听说BL-classes在设计上是无状态的,实体类(或者至少我称之为Person(id,name,..))是有状态的等等.
我认为重要的是要知道,因为我相信如果我能理解它,我可以编写更好的代码(例如粒度).
无论如何,真的很短,这就是我所知道的'有状态对无国籍:
有状态(如WinForms):存储数据以供进一步使用,但限制了应用程序的可伸缩性,因为它受CPU或内存限制的限制
无状态(与ASP.NET一样 - 尽管ASP尝试使用ViewStates保持状态):操作完成后,数据将被传输,实例将被传回线程池(Amorphous).
正如您所看到的,它是非常模糊和有限的信息(并且非常关注服务器交互),所以如果您能为我提供更多美味的信息,我将非常感激:)
我正在Google表格中创建一个菜单项,该菜单项将列出工作目录并提取该用户的电子邮件地址,以供以后在Google表格中处理员工记录。我正在尝试使其像这样工作:
function onOpen() {
var ui = SpreadsheetApp.getUi();
// Or DocumentApp or FormApp.
var myapp = ui.createMenu('MyApp');
var pullemp = myapp.addSubMenu(ui.createMenu('Pull Employee')
.addItem('Nathaniel MacIver', menuItem2('nm@emailaddress.com')));
myap.addToUi();
}
function menuItem2(email) {
SpreadsheetApp.getUi() // Or DocumentApp or FormApp.
.alert('That email address is '+email);
}
Run Code Online (Sandbox Code Playgroud)
现在,当我打开电子表格时,该项目立即触发,并在下面得到我想要的结果:
但是我希望当我单击菜单中的按钮时触发它。照原样,当我单击菜单按钮时出现错误:
我知道该链接提到功能名称必须是一个字符串值,但是为什么它会按需要在加载时工作,然后在按下按钮时失败?
我正在尝试使用 Google Apps 脚本在 Google 表格中创建一个动态填充的菜单。
该表称为“类”。类表中的值是 8H、9p1、9p2 等。它们位于单元格 A1:A12 中。在调试器中,数组 menuItemArray 正确加载了“类”表中所有预期的类。
我得到的错误是:
类型错误:在对象 9p1 中找不到函数 addSubMenu。(第 13 行,文件“代码”)
这是踏入队伍的时候
menuItemArrayClass = menuItemArray [menuCount]
Run Code Online (Sandbox Code Playgroud)
对于我做错了什么或有什么更好的方法可以提供任何帮助,我将不胜感激。
这是我的代码:
function onOpen(e) {
var ui = SpreadsheetApp.getUi();
var menuCount = 0;
ui.createMenu('Manage Timetable')
.addItem('First item', 'menuItem1')
.addSeparator()
var menuItemArray = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Classes').getDataRange().getValues();
for (menuCount=1;menuCount < menuItemArray.length;++menuCount) {
var menuItemArrayClass = []
menuItemArrayClass = menuItemArray [menuCount]
.addSubMenu(ui.createMenu('Manage Classes')
.addItem(menuItemArrayClass [menuCount] + 'Schedule Timetable', 'runBatch1'))
.addToUi();
}
}
Run Code Online (Sandbox Code Playgroud)
我正在为一所学校构建一个容器绑定的谷歌应用程序脚本。学校要求每一个书面项目都有“学校标题”。学校使用 AG 块作为句点。我的目标是会有一个菜单“学校标题”,打开时有子菜单“A 块”、“B 块”、“C 块”,并且在每个子菜单中每个班级都会有一个选项,其中将该类的标题插入到文档的标题中
这是我的代码:
var BLOCKS = "abcdefg";
var CLASSES = ["English", "History", "Science", "Writing", "Latin", "Math", "Study Skills"];
var FUNCTION_NAMES;
var global = {};
init();
/**
* The onOpen function runs automatically when the Google Docs document is
* opened. Use it to add custom menus to Google Docs that allow the user to run
* custom scripts. For more information, please consult the following two
* resources.
*
* Extending Google Docs developer guide:
* …Run Code Online (Sandbox Code Playgroud) 请参阅下面的示例,
function doSomething1(){/*needs ss*/const ss = SpreadsheetApp.openById(/*SPREADSHEET_ID*/);}
function doSomething2(){/*needs ss*/const ss = SpreadsheetApp.openById(/*SPREADSHEET_ID*/);}
function doItAll(){
doSomething1();
doSomething2();
}
Run Code Online (Sandbox Code Playgroud)
可以使用全局变量来简化,而不是在两个函数中调用 Spreadsheet
const ss = SpreadsheetApp.openById(/*SPREADSHEET_ID*/);
function doSomething1(){/*do something with ss*/}
function doSomething2(){/*do something with ss*/}
function doItAll(){
doSomething1();
doSomething2();
}
Run Code Online (Sandbox Code Playgroud)
这里的问题可以在不使用全局变量的情况下通过简单地ss在函数之间传递变量来解决。但是,由于多个函数需要访问该变量,这会变得更加复杂ss。而且通过ss很麻烦。没有太多方法可以避免应用程序脚本中的全局。不支持模块。如果您使用 IIFE,则所有函数都对 IDE 隐藏,从而无法从 IDE 或其他任何地方调用函数。在这里使用全局要优雅得多。但如果我有一个简单的触发器,就会出现问题:
const ss = SpreadsheetApp.openById(/*SPREADSHEET_ID*/);
function doSomething1(){/*do something with ss*/}
function doSomething2(){/*do something with ss*/}
function doItAll(){
doSomething1();
doSomething2();
}
function onOpen(){/*Adds a menu*/}
Run Code Online (Sandbox Code Playgroud)
添加菜单将失败,因为此行之前onOpen已加载,并且此行需要权限/授权,而作为简单触发器,不会使用任何需要授权的代码运行。SpreadsheetApp.openById(/*SPREADSHEET_ID*/)onOpenonOpen …
lazy-loading global-variables google-sheets google-apps-script