【问题标题】:How to create custom keyboard shortcuts for google app script functions?如何为谷歌应用脚​​本功能创建自定义键盘快捷键?
【发布时间】:2012-11-23 18:31:52
【问题描述】:

我正在尝试了解用 Google Doc 电子表格替换我的一些 Microsoft Excel 电子表格的可行性。如何在谷歌文档电子表格中为谷歌应用脚​​本函数创建自定义键盘快捷键?这是我通常用 VBA 和 Excel 做的事情。

【问题讨论】:

    标签: google-apps-script google-sheets keyboard-shortcuts


    【解决方案1】:

    Apps 脚本仅公开 server side events。不幸的是,您今天无法注册诸如键盘敲击之类的客户端事件。请在我们的issue tracker 中记录问题

    【讨论】:

    • 问题跟踪器上最接近的问题似乎是issue 306,这可能需要更多的星/赞成票,但应用程序团队对此保持沉默:(
    • 有人在issue 306 post 33添加了一个可行的解决方案!
    • 你可以用宏来做到这一点
    • 请参阅下面的答案以了解宏的讨论(点击点击点击)
    【解决方案2】:

    最近(2018 年 4 月)Google 推出了宏记录器,其中包括分配键盘快捷键以触发宏的方法以及将现有脚本作为宏导入的方法。见Google Sheets Macros

    注意:此功能目前正在推出,因此可能需要几周时间才能对所有人开放。就我而言,它首先在我的个人 Google 帐户上可用,从昨天开始,它在我的一个 G Suite 帐户上可用。

    【讨论】:

      【解决方案3】:

      现在在表格中支持此功能(请参阅 https://issuetracker.google.com/issues/36752620),但在文档中尚不支持。查看并加注星标https://issuetracker.google.com/issues/36752620 以获得文档支持

      【讨论】:

      • 你的答案到底添加了什么?
      • @nawfal 这可能是一条评论
      • @Imray 不,这在之前的任何答案中都没有提到,这就是重点。得到正确的票是回答者所做的,这很棒。这与要求 OP 记录一张新票或自己搜索并找到一张是不同的(而且更有帮助)。
      • 加注星号 issuetracker.google.com/issues/79461369,因为最初链接的那个被标记为“已修复”,尽管修复仅适用于表格。
      • @Kev 谢谢,我添加了新问题的链接。
      【解决方案4】:

      解决方案已在issue 306 上发布!对于懒人来说,这里是:

      HtmlService 中的新 IFRAME 模式确实允许将密钥代码传递给附加组件...

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

      必须先点击/激活侧边栏才能实现。

      【讨论】:

      • 完整的实现代码见here
      • 非常感谢!这确实适用于工作表。现在我们可以为任何宏做任何键盘快捷键,而不仅仅是默认的那些:繁琐的 Alt+Ctrl+Shift
      【解决方案5】:

      好消息 :) 您可以按照以下简单步骤为 Google 应用脚本功能实现自定义键盘快捷键:

      1. 在 Google 表格 UI 中,选择工具 > 宏 > 录制宏
      2. 记录任何动作。例如,更改 A1 中的颜色背景。按保存
      3. 使用随机标题和首选快捷方式保存它。 您可以稍后更改
      4. 选择工具 > 脚本编辑器,在 Apps 脚本编辑器中打开绑定到工作表的脚本。
      5. 在新的编辑器选项卡中,选择查看>显示清单文件
      6. TA - 达! :D 将 functionName 值更改为所需的值;)

      记住宏函数不应该接受参数并且不返回任何值。更多信息https://developers.google.com/apps-script/guides/sheets/macros#importing_functions_as_macros

      【讨论】:

      • 这个答案几个月前已经在这个问题的另一个答案中给出:stackoverflow.com/a/49946187
      • 确实,但如果出现以下情况,IMO 的答案并不清楚:1. 可以在 google docs 电子表格中为 google app 脚本功能创建自定义键盘快捷键 2. 怎么做
      • 嗯...快捷键必须采用 option+cmd+shift+N 的形式,其中 N 是数字键 - 有点蹩脚。
      【解决方案6】:

      刚刚更新,现在可能是 The Guy 提到的解决方法,通过 IFRAME,您可以创建一个侧边栏,一个 STUB 只是为了输入键盘命令,用 jquery 处理它们,并运行适当的功能,已经在使用它了。

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

          我正在努力解决类似的问题,虽然我还没有得到太多解决,但我认为可以通过keypress event handler under Class Textbox找到前进的方向

          我不知道这是否仅解决了 Arun 指出的服务器端问题,但我肯定希望如此。在我浪费太多时间尝试这个之前,请随时纠正我的推理! :)

          【讨论】:

          • 此方法是 UiApp 服务的一部分,它不提供从文档或电子表格 Ui 中调用函数的解决方案。在 UiApp 或 html 服务中你当然可以使用按键来触发事件
          • 好的。那么有什么东西可以阻止 UiApp 或 html 服务(我假设它可能是扩展的一部分)调用在 Google Docs 上用 Apps Script 编写的宏,然后可以执行键盘快捷键直接完成的所需步骤?
          • 确实没什么...可以将这样的模式与侧边栏一起使用...侧边栏中的 ui 将具有可以调用脚本函数的按钮。一些新的附加组件以非常优雅的方式使用该配置。
          • 感谢您的回复。我不禁想知道为什么回答最初的问题就像拔牙一样。
          • UI Service 及其方法,包括引用的按键方法已被弃用。
          【解决方案9】:

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

          就可行性而言,它不像您已经熟悉的 vba 那样容易,但是一旦您通过不同的做事方式并没有那么困难。

          【讨论】:

          • 我想我不明白你在说什么。您是否有文章或一些文档的链接,或者您可以展示一个示例吗?
          • 对不起,没有。我只是在为朋友研究类似问题时阅读了相关文档。不幸的是,我必须承认我现在的回答似乎是错误的。我无法确认这一点,但我可以告诉最近的在文档文本输入面板上获取句柄的能力被阻止了。我可以编写一个 html 服务侧边栏,但我无法获取必要的对象来为主文档面板创建按键事件处理程序。我推测他们可能试图阻止某人编写键盘记录器或其他东西。
          猜你喜欢
          • 2011-05-06
          • 1970-01-01
          • 2012-08-28
          • 1970-01-01
          • 2013-10-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多