Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Google应用程序脚本-将匿名函数传递到Menu.addItem_Javascript_Google Apps Script_Eval - Fatal编程技术网

Javascript Google应用程序脚本-将匿名函数传递到Menu.addItem

Javascript Google应用程序脚本-将匿名函数传递到Menu.addItem,javascript,google-apps-script,eval,Javascript,Google Apps Script,Eval,我正在为一所学校构建一个绑定到容器的谷歌应用程序脚本。学校要求每个书面项目都有“学校标题”。学校使用A-G区作为课时。我的目标是,将有一个菜单,“学校标题”,当打开它时,它有子菜单“a区”、“B区”、“C区”,并且在每个子菜单中,每个类都有一个选项,它将把该类的标题插入文档的标题中 这是我的密码: var BLOCKS = "abcdefg"; var CLASSES = ["English", "History", "Science", "Writing", "Latin", "Math",


我正在为一所学校构建一个绑定到容器的谷歌应用程序脚本。学校要求每个书面项目都有“学校标题”。学校使用A-G区作为课时。我的目标是,将有一个菜单,“学校标题”,当打开它时,它有子菜单“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:
 *     https://developers.google.com/apps-script/guides/docs
 *
 * Document service reference documentation:
 *     https://developers.google.com/apps-script/reference/document/
 */
function onOpen() {
  init();
  // Add a menu with some items, some separators, and a sub-menu.
  var menu = DocumentApp.getUi().createMenu('School Heading')
  for(var i = 0; i < BLOCKS.length; i++){
    block = BLOCKS[i];
    Logger.log("Block: " + block)
    menu = menu.addSubMenu(DocumentApp.getUi().createMenu(block + " Block")
                           .addItem('English', 'eng' + block)
                           .addItem('History', 'his' + block)
                           .addItem('Science', 'sci' + block)
                           .addItem('Writing', 'wri' + block)
                           .addItem('Latin', 'lat' + block)
                           .addItem('Math', 'mat'  + block) 
                           .addItem('Study Skills', 'stu' + block));
    defineFunctions(block, this);
  }
  menu.addToUi();
}

function getFunc(class,block){
  return function(){
    createHeading(class,block);
  }
}

function defineFunctions(block, global){
  Logger.log(FUNCTION_NAMES)
  for(var i = 0; i < FUNCTION_NAMES.length; i++){
    var funcName = FUNCTION_NAMES[i] + block;
    eval("function " + funcName + " () { createHeading('"+ CLASSES[i] + "', '" + block + "'); }");
  }
}

function createHeading(class, block){
  var header = DocumentApp.getActiveDocument().getHeader();
  if(!header){
    header = DocumentApp.getActiveDocument().addHeader();
  }
  header.insertParagraph(0, "Name\n{class}, Block {block}".replace("{class}", class).replace("{block}", block)).setAlignment(DocumentApp.HorizontalAlignment.RIGHT);
}

function init(){
  if(!Array.isArray(BLOCKS)){
    BLOCKS = BLOCKS.toUpperCase().split("");
  }
  if(!Array.isArray(CLASSES)){
    CLASSES = CLASSES.split("\n");
  }
  if(!Array.isArray(FUNCTION_NAMES) || FUNCTION_NAMES.length !== CLASSES.length){
    FUNCTION_NAMES = [];
    for(var i = 0; i < CLASSES.length; i++){
      FUNCTION_NAMES.push(CLASSES[i].toLowerCase().substring(0,3));
    }
  }
}
var BLOCKS=“abcdefg”;
var课程=[“英语”、“历史”、“科学”、“写作”、“拉丁语”、“数学”、“学习技能”];
var函数名称;
var全局={};
init();
/**
*打开Google文档时,onOpen函数将自动运行
*打开。使用它可以将自定义菜单添加到允许用户运行的Google文档中
*自定义脚本。有关更多信息,请咨询以下两个
*资源。
*
*扩展Google Docs开发者指南:
*     https://developers.google.com/apps-script/guides/docs
*
*文档服务参考文档:
*     https://developers.google.com/apps-script/reference/document/
*/
函数onOpen(){
init();
//添加包含一些项目、分隔符和子菜单的菜单。
var menu=DocumentApp.getUi().createMenu('学校标题')
对于(变量i=0;i
当我选择学校标题>A Block>English时,我得到“脚本函数未找到engA”


我的问题是,为什么eval不起作用,我是否可以将匿名函数传递给Menu.addItem?

我相信eval可能起作用,但不能保证它与调用Menu时执行的脚本实例相同。GoogleApps脚本在您准备调用菜单之前无法将所有这些功能保留在内存中,因此,到那时,您已经有了一张干净的记录,所有这些功能都不再被引用

在这个阶段不可能传递匿名函数/参数,它被归类为一种增强:尽管在这方面没有多大进展

你为什么不使用一个侧栏而不是菜单,在那里你可以创建一个带有选择器的UI,根据它可以插入正确的标题。一旦你有了这个机制,你就可以用侧栏来做其他很酷的东西了

您的
eval()
正在为函数中的
循环定义
内的函数,因此作用域规则意味着它们在该范围外不可用。通过将该代码移到所有其他函数之外,脚本的每个运行实例都可以使用
eval()
'd函数

这项工作:

var BLOCKS = "abcdefg";
var CLASSES = ["English", "History", "Science", "Writing", "Latin", "Math", "Study Skills"];
var FUNCTION_NAMES;
var global = {};

init();
/// Moved
for(var _i = 0; _i < BLOCKS.length; _i++){
var _block = BLOCKS[_i];
  for(var _j = 0; _j < FUNCTION_NAMES.length; _j++){
    var _funcName = FUNCTION_NAMES[_j] + _block;
    eval("function " + _funcName + " () { createHeading('"+ CLASSES[_j] + "', '" + _block + "'); }");
  }
}
///
debugger;  // Pause in debugger (All the functions are there!)

/**
 * 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:
 *     https://developers.google.com/apps-script/guides/docs
 *
 * Document service reference documentation:
 *     https://developers.google.com/apps-script/reference/document/
 */
function onOpen() {
  // Add a menu with some items, some separators, and a sub-menu.
  var menu = DocumentApp.getUi().createMenu('School Heading')
  for(var i = 0; i < BLOCKS.length; i++){
    block = BLOCKS[i];
    Logger.log("Block: " + block)
    menu = menu.addSubMenu(DocumentApp.getUi().createMenu(block + " Block")
                           .addItem('English', 'eng' + block)
                           .addItem('History', 'his' + block)
                           .addItem('Science', 'sci' + block)
                           .addItem('Writing', 'wri' + block)
                           .addItem('Latin', 'lat' + block)
                           .addItem('Math', 'mat'  + block) 
                           .addItem('Study Skills', 'stu' + block));
    //defineFunctions(block, this);
  }
  menu.addToUi();
}

function getFunc(class,block){
  return function(){
    createHeading(class,block);
  }
}

function defineFunctions(block, global){
  Logger.log(FUNCTION_NAMES)
  for(var i = 0; i < FUNCTION_NAMES.length; i++){
    var funcName = FUNCTION_NAMES[i] + block;
    eval("this[" + funcName + "] = function () { createHeading('"+ CLASSES[i] + "', '" + block + "'); }");
  }
  debugger;
}

function createHeading(class, block){
  var header = DocumentApp.getActiveDocument().getHeader();
  if(!header){
    header = DocumentApp.getActiveDocument().addHeader();
  }
  header.insertParagraph(0, "Name\n{class}, Block {block}".replace("{class}", class).replace("{block}", block)).setAlignment(DocumentApp.HorizontalAlignment.RIGHT);
}

function init(){
  if(!Array.isArray(BLOCKS)){
    BLOCKS = BLOCKS.toUpperCase().split("");
  }
  if(!Array.isArray(CLASSES)){
    CLASSES = CLASSES.split("\n");
  }
  if(!Array.isArray(FUNCTION_NAMES) || FUNCTION_NAMES.length !== CLASSES.length){
    FUNCTION_NAMES = [];
    for(var i = 0; i < CLASSES.length; i++){
      FUNCTION_NAMES.push(CLASSES[i].toLowerCase().substring(0,3));
    }
  }
}
var BLOCKS=“abcdefg”;
var课程=[“英语”、“历史”、“科学”、“写作”、“拉丁语”、“数学”、“学习技能”];
var函数名称;
var全局={};
init();
///移动
对于(var_i=0;_i