回答

19

Apps脚本仅公开server side events。不幸的是,你今天不能注册像键盘笔画这样的客户端事件。请在我们的登录问题issue tracker

+1

问题跟踪器最接近的问题似乎是[问题306](https://code.google.com/p/google-apps-script-issues/issues/detail?id = 306)这可以做一些更多的星星/ upvotes,但是应用程序团队对此有一种震耳欲聋的沉默:( –

+0

有人在[issue 306 post 33](https://code.google。)上添加了一个工作解决方案。 com/p/google-apps-script-issues/issues/detail?id = 306#c33)! –

9

正如@Arun所说,这还不支持。请参阅并明星issue

+1

你的答案到底是什么? – CodyBugstein

+0

@Imray这不难搞清楚; – nawfal

+1

@nawfal它可能有已发表评论 – CodyBugstein

0

我有一个类似的问题,尽管我没有得到多少解决但我想前进的方向可以通过这个keypress event handler under Class Textbox

发现我不知道,如果这都绕服务器的问题所困扰只有阿伦指出,但我确信希望如此。在我浪费太多时间尝试之前,请随时纠正我的推理! :)

+0

此方法是UiApp服务的一部分,它不提供从文档或电子表格UI中调用函数的解决方案。在UiApp或html服务中,您当然可以使用按键来触发事件 –

+0

好的。那么有没有什么可以让UiApp或html服务(我认为可以成为扩展的一部分)调用在Google Docs中编写的Apps脚本中的宏,然后可以执行键盘快捷方式直接完成的必需步骤? –

+0

确实没什么...可以使用这种模式与侧边栏...边栏中的用户界面将具有可以调用脚本功能的按钮。一些新的附加组件以非常优雅的方式使用该配置。 –

0

长话短说:写一个html服务,它使用按键事件处理程序捕获按键事件,并将它们与所需的热键快捷键进行比较,然后在应用程序脚本中调用服务器端的相应子例程以内联要求按键,格式或文档更改。

就可行性而言,并不像你已经熟悉的vba那么简单,但是一旦你通过了不同的做事方式,并不那么困难。

+0

我不认为我明白你在说什么。你有链接到一篇文章或一些文档,或者你能展示一个例子吗? – User

+1

对不起,没有。我只是在为朋友研究类似问题的同时阅读相关文件。 不幸的是,我必须承认,我现在的答案似乎是错误的。我无法得到此确认,但离我最近的人可以告诉我们处理Docs文本输入面板的功能被阻止。我可以编写一个html服务侧边栏,但我无法获取必要的对象,以便为主文档面板创建按键事件处理程序。我猜测他们可能是在试图阻止某人编写键盘记录或其他东西。 –

2

只是更新,现在可能的解决方案,盖伊提到,通过IFRAME,你可以创建一个侧栏,一个STUB只是为了进入键盘命令,用jquery处理它们,并运行适当的功能, 。

5

解决方案已发布在issue 306!对于懒惰的,那就是:

在HtmlService新IFRAME模式确实允许键码传递到插件...

$(document).keydown(function(e){ 
    //CTRL + V keydown combo 
    if(e.ctrlKey && e.keyCode == 86){ 
    $('#output').html("I've been pressed!"); 
    } 
}) 

必须点击/第一激活侧边栏为了发生。

+2

完整的代码来实现它可以在这里找到(https://stackoverflow.com/a/44345522/3154274) – Enora

1

为此,一个可能的解决方法是专门为“触发器文本”设置专栏,为您要执行的每个操作定义不同的基于文本的触发器,然后创建一个函数来检查值并执行操作基于“触发文本”。然后,您可以在脚本编辑器的“资源”下的项目触发器中为热键功能设置一个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(); 
    } 
    } 
}