【发布时间】:2012-11-23 18:31:52
【问题描述】:
我正在尝试了解用 Google Doc 电子表格替换我的一些 Microsoft Excel 电子表格的可行性。如何在谷歌文档电子表格中为谷歌应用脚本函数创建自定义键盘快捷键?这是我通常用 VBA 和 Excel 做的事情。
【问题讨论】:
标签: google-apps-script google-sheets keyboard-shortcuts
我正在尝试了解用 Google Doc 电子表格替换我的一些 Microsoft Excel 电子表格的可行性。如何在谷歌文档电子表格中为谷歌应用脚本函数创建自定义键盘快捷键?这是我通常用 VBA 和 Excel 做的事情。
【问题讨论】:
标签: google-apps-script google-sheets keyboard-shortcuts
Apps 脚本仅公开 server side events。不幸的是,您今天无法注册诸如键盘敲击之类的客户端事件。请在我们的issue tracker 中记录问题
【讨论】:
最近(2018 年 4 月)Google 推出了宏记录器,其中包括分配键盘快捷键以触发宏的方法以及将现有脚本作为宏导入的方法。见Google Sheets Macros
注意:此功能目前正在推出,因此可能需要几周时间才能对所有人开放。就我而言,它首先在我的个人 Google 帐户上可用,从昨天开始,它在我的一个 G Suite 帐户上可用。
【讨论】:
现在在表格中支持此功能(请参阅 https://issuetracker.google.com/issues/36752620),但在文档中尚不支持。查看并加注星标https://issuetracker.google.com/issues/36752620 以获得文档支持
【讨论】:
解决方案已在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 应用脚本功能实现自定义键盘快捷键:
记住宏函数不应该接受参数并且不返回任何值。更多信息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();
}
}
}
【讨论】:
我正在努力解决类似的问题,虽然我还没有得到太多解决,但我认为可以通过keypress event handler under Class Textbox找到前进的方向
我不知道这是否仅解决了 Arun 指出的服务器端问题,但我肯定希望如此。在我浪费太多时间尝试这个之前,请随时纠正我的推理! :)
【讨论】:
长话短说:编写一个 html 服务,它使用按键事件处理程序来捕获按键事件并将它们与您想要的热键快捷方式进行比较,然后在应用程序脚本中调用服务器端的适当子例程以内联被调用的按键事件、格式或文档更改。
就可行性而言,它不像您已经熟悉的 vba 那样容易,但是一旦您通过不同的做事方式并没有那么困难。
【讨论】: