我试图了解用 Google Doc Spreadsheets 替换我的一些 Microsoft Excel 电子表格的可行性。如何在谷歌文档电子表格中为谷歌应用脚本函数创建自定义键盘快捷键?这是我通常用 VBA 和 Excel 做的事情。
9 回答
Apps 脚本仅公开服务器端事件。不幸的是,您今天无法注册诸如键盘敲击之类的客户端事件。请在我们的问题跟踪器中记录问题
现在在表格中支持此功能(请参阅https://issuetracker.google.com/issues/36752620),但在 Docs 中尚不支持。查看并加注星标 https://issuetracker.google.com/issues/36752620以获得文档支持
最近(2018 年 4 月)谷歌推出了一个宏记录器,其中包括一种分配键盘快捷键来触发宏的方法,以及一种将现有脚本作为宏导入的方法。请参阅Google 表格宏
注意:此功能目前正在推出,因此可能需要几周时间才能供所有人使用。就我而言,它首先在我的个人 Google 帐户上可用,从昨天开始,它在我的一个 G Suite 帐户上可用。
解决方案已在issue 306上发布!对于懒人来说,这里是:
HtmlService 中的新 IFRAME 模式确实允许将密钥代码传递给附加组件......
$(document).keydown(function(e){
//CTRL + V keydown combo
if(e.ctrlKey && e.keyCode == 86){
$( '#output' ).html("I've been pressed!");
}
})
必须先单击/激活侧边栏才能发生这种情况。
好消息 :) 您可以按照以下简单步骤为 google app 脚本功能实现自定义键盘快捷键:
- 在 Google 表格 UI 中,选择工具 > 宏 > 录制宏。
- 记录任何动作。例如,更改 A1 中的颜色背景。按保存。
- 使用随机标题和首选快捷方式保存它。您可以稍后更改它。
- 选择工具 > 脚本编辑器以在 Apps 脚本编辑器中打开绑定到工作表的脚本。
- 在新的编辑器选项卡中,选择查看 > 显示清单文件
- TA - 达!:D 将functionName值更改为所需的值;)
记住宏函数不应该接受参数并且不返回任何值。更多信息,请访问https://developers.google.com/apps-script/guides/sheets/macros#importing_functions_as_macros
刚刚更新,现在可能是 The Guy 提到的解决方法,通过 IFRAME,您可以创建一个侧边栏,一个 STUB 只是为了输入键盘命令,用 jquery 处理它们,并运行适当的功能,已经在使用它了。
一种可能的解决方法是为“触发文本”指定一个列,为您尝试执行的每个操作定义不同的基于文本的触发器,然后创建一个检查值并根据“触发文本”。然后,您可以在脚本编辑器的“资源”下的项目触发器中为您的热键功能设置 onEdit 事件触发器。
这种方法的最大缺点是(至少对我而言)onEdit 触发器需要大约 7 秒的时间来捕获更改并执行更新。如果您需要更快地处理某些内容,则可能需要寻找替代方法。
我在下面提供了一个示例,说明如何根据指定的“触发器”列中的触发器文本更改行颜色。您可以使用它来执行任何可以通过脚本在工作表上完成的操作,例如更改值、设置字体粗细、复制数据,甚至在检查触发文本输入后运行其他功能。
/*you will need to add an onEdit trigger to your project
for this to run when you edit the cell*/
//function to update row color using entered text in a specified "trigger" column
function hotKey(){
//get the cell you edited and the associated column and row number
var cell = sheet.getActiveCell();
var thisCol = cell.getColumn();
var thisRow = cell.getRow();
//set a range variable for the entire row
var colorRow = sheet.getRange(thisRow,thisCol,1,Cols);
//get the edited value for the cell as a string
var val = cell.getValue().toString();
//check that the edited cell is in the trigger column
if (thisCol = 1){
//update the row color based on the entered value
if(val == "g"){
colorRow.setBackground("#00ff00"); //sets row color to green
cell.clearContent(); //delete the trigger cell value
}else if(val == "r"){
colorRow.setBackground("#ff0000");
cell.clearContent();
}else if(val == "fd"){
colorRow.setBackground("#fff2cc");
cell.clearContent();
}else if(val == "pr"){
colorRow.setBackground("#ffff00");
cell.clearContent();
}else if(val == "cn"){
colorRow.setBackground("#6fa8dc");
cell.clearContent();
}
}
}
长话短说:编写一个 html 服务,它使用按键事件处理程序来捕获按键事件并将它们与您想要的热键快捷方式进行比较,然后在应用程序脚本中调用服务器端的适当子例程以内联调用的按键、格式或文件更改。
就可行性而言,它不像您已经熟悉的 vba 那样容易,但是一旦您通过了不同的做事方式,就不是那么困难了。
我正在为类似的问题而苦苦挣扎,虽然我还没有得到太多解决,但我认为可以通过Class Textbox 下的这个 keypress 事件处理程序找到前进的方向
我不知道这是否仅解决了 Arun 指出的服务器端问题,但我肯定希望如此。在我浪费太多时间尝试这个之前,请随时纠正我的推理!:)