如何使用Typescript动态更新图纸自定义菜单



如何使用Typescript 动态更新图纸自定义菜单

我已经实现了以下内容:使用谷歌应用程序脚本动态更新谷歌电子表格的自定义菜单使用谷歌应用软件脚本动态更新Google电子表格的定制菜单的示例脚本。

但在Typescript中,单击菜单项时出现异常:Script function not found: Col1

打字稿还需要其他东西吗?

主.ts

import { CustomMenu } from './ui/CustomMenu'
function onOpen() {
CustomMenu.createMenu()
}

主要.gs

// Compiled using ts2gas 3.6.5 (TypeScript 4.3.2)
var exports = exports || {};
var module = module || { exports: exports };
//import { CustomMenu } from './ui/CustomMenu'
function onOpen() {
//var menu = Menu.createMenu('Tracker')
var menu = CustomMenu.createMenu();
}

自定义菜单.ts

export module CustomMenu {
export function createMenu() {
var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var headers = ss.getRange(1, 1, 1, ss.getLastColumn()).getValues()[0];
var ui = SpreadsheetApp.getUi();
var menu = ui.createMenu('Custom Menu')
.addItem('First item', 'menuItem1')
.addSeparator();
var subMenu = ui.createMenu('Sub-menu');
for (var i = 0; i < headers.length; i++) {
var dynamicMenu = headers[i];
this[dynamicMenu] = dynamicItem(i);
subMenu.addItem(dynamicMenu, dynamicMenu);
}
menu.addSubMenu(subMenu).addToUi();
}
}
function dynamicItem(i) {
return function() {
var sheet = SpreadsheetApp.getActiveSheet();
sheet.getRange(2, i + 1, sheet.getLastRow() - 1, 1).activate();
}
}

自定义菜单.gs

// Compiled using ts2gas 3.6.5 (TypeScript 4.3.2)
var exports = exports || {};
var module = module || { exports: exports };
exports.CustomMenu = void 0;
var CustomMenu;
(function (CustomMenu) {
function createMenu() {
var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var headers = ss.getRange(1, 1, 1, ss.getLastColumn()).getValues()[0];
var ui = SpreadsheetApp.getUi();
var menu = ui.createMenu('Custom Menu')
.addItem('First item', 'menuItem1')
.addSeparator();
var subMenu = ui.createMenu('Sub-menu');
for (var i = 0; i < headers.length; i++) {
var dynamicMenu = headers[i];
this[dynamicMenu] = dynamicItem(i);
subMenu.addItem(dynamicMenu, dynamicMenu);
}
menu.addSubMenu(subMenu).addToUi();
}
CustomMenu.createMenu = createMenu;
})(CustomMenu = CustomMenu || (CustomMenu = {}));
function dynamicItem(i) {
return function () {
var sheet = SpreadsheetApp.getActiveSheet();
sheet.getRange(2, i + 1, sheet.getLastRow() - 1, 1).activate();
};
}

修改点:

  • 我认为在您的脚本中,当运行Col1的菜单时,不会创建函数
  • 此外,我认为您问题的原因是this[dynamicMenu] = dynamicItem(i);
    • 我认为在您的情况下,函数中的this不能用于安装函数

在上述情况下,Script function not found: Col1出现错误。因此,为了避免当前脚本出现此问题,下面的修改如何?

修改的脚本:

在这个答案中,我修改了你的脚本如下。

Main.ts:

import { CustomMenu } from './ui/CustomMenu'
function onOpen() {
CustomMenu.createMenu(this)
}
CustomMenu.createMenu(this)
当从自定义菜单运行函数时,函数onOpen中的CustomMenu.createMenu(this)将运行。通过这种方式,函数被动态地创建

CustomMenu.ts:

export module CustomMenu {
export function createMenu(obj) {
var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var headers = ss.getRange(1, 1, 1, ss.getLastColumn()).getValues()[0];
var ui = SpreadsheetApp.getUi();
var menu = ui.createMenu('Custom Menu')
.addItem('First item', 'menuItem1')
.addSeparator();
var subMenu = ui.createMenu('Sub-menu');
for (var i = 0; i < headers.length; i++) {
var dynamicMenu = headers[i];
obj[dynamicMenu] = dynamicItem(i);
subMenu.addItem(dynamicMenu, dynamicMenu);
}
menu.addSubMenu(subMenu).addToUi();
}
}
function dynamicItem(i) {
return function() {
var sheet = SpreadsheetApp.getActiveSheet();
sheet.getRange(2, i + 1, sheet.getLastRow() - 1, 1).activate();
}
}

最新更新