Google 文档 - 实时访问文本更改

2024-04-14

Goal

我们的用户在 Google 文档中工作。他们编写的文本将在他们输入时使用文本转语音朗读给他们听。 它应该能够跨尽可能多的平台和浏览器工作。

我们的解决方案

这似乎适合谷歌应用脚​​本 https://developers.google.com/apps-script/,它适用于所有桌面浏览器和一些移动浏览器。

这有效

我们有一个文本转语音模块,效果很好,所以这不是问题。 我们正在使用一个sidebar https://developers.google.com/apps-script/quickstart/docs现在。侧边栏可以使用以下方式播放音频HTML 5 音频标签 http://www.w3schools.com/html/html5_audio.asp其工作没有任何问题。

问题

问题实际上是从 Google 文档中获取文本。 到目前为止,我还没有找到任何方法可以直接从侧边栏访问 Google 文档文本。 相反,我们一直在做的是:

  1. 侧边栏每 x 毫秒轮询一次在 Google 云上运行的 Google Apps 脚本
  2. 我们的 Google Apps 脚本在 Google 云上运行,然后访问云中的同步文档
  3. 如果发现任何更改,会将其发送回侧边栏
  4. 侧边栏使用 HTML5 音频标签和我们的文本转语音来播放音频。

从用户在 google docs 中输入文本到更改同步到 google docs 云中需要一秒或更长时间。

我们已经安排了不同步骤的时间。文字转语音速度很快,HTML5 音频也没有问题。

The 时间沉没正在得到文本更改。目前需要1-3秒,这对于我们的用例来说太长了。

Question

我们能否更快地访问 Google 文档中的文本?也许直接而不是通过谷歌的云?

更新2017-02-15目前看来是不可能的。 可以使用 Chrome 扩展来完成此操作,它解析 Google Docs 主页并从 HTML+JS 中提取文本。这是相当困难的,但是……是可能的。


如果浏览器插件是提供该功能的适当方式,那么应该可以监听 Google Docs 在更新页面内容时对 DOM 所做的更改。

// This div contains all of the page content and not much else, in my rudimentary testing.
var pageRoot = document.getElementsByClassName('kix-appview-editor')[0].firstChild;

var observer = new MutationObserver(handleNewChanges);
observer.observe(pageRoot, {
  subtree: true,
  childList: true,
  attributes: false,
});

// Later, you can stop observing
observer.disconnect();

Your handleNewChanges每当 DOM 内容发生更改时都会调用该函数,并附带更改列表。这些变化相当混乱,但是

  • 可以通过查看添加和删除的节点来过滤无关紧要的更改(例如用户选择某些文本),
  • 您可以沿着 DOM 树查找文档中更改的位置,并且
  • 您可以使用someNode.innerText以获得实际内容。

通过观察更改并保留某些文档状态,您应该能够确定您关心的更改何时发生。


这似乎很适合您的用例,因为

  • 不需要远程服务器。数据流看起来更像是这样,完全在浏览器选项卡中:

    ---------------                   ----------        
    | Google Docs | <=  fetch doc  <= |  Your  |
    |  Document   | => DOM changes => | Module |
    ---------------                   ----------
    
  • 更新与文档视觉更新同步,这感觉触发此操作是很自然的事情。

  • 解析每个 DOM 更改所需的簿记量可能是恒定的(即,无需循环遍历文档内容)。这意味着观察增加的开销是恒定的,因此它应该扩展到任何大小的文档。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Google 文档 - 实时访问文本更改 的相关文章

随机推荐

  • Golang 预处理器类似 C 风格的编译开关

    GO语言有预处理器吗 当我查找互联网时 几乎没有将 pgo 转换为 go 的方法 而且 我想知道这在 Go 中是否可行 ifdef COMPILE OPTION compile this code elif compile another
  • 将 html 表单值传递给 google 搜索查询[重复]

    这个问题在这里已经有答案了 旁注 在每个人告诉我谷歌的自定义搜索引擎之前 我一直在使用它直到现在 但我发现很难设计该搜索框的样式 并且它在我的网站上崩溃了 Hello 我正在尝试创建一个使用 HTML 表单输入的 google 搜索查询 我
  • VBA:运行时错误“91”?

    我在这里想做的就是保存对当前活动窗口的引用 但它似乎不起作用 它在最后一行给了我一个运行时错误 Dim SourceWindow As Window QACheckWindow As Window SourceWindow ActiveWi
  • iOS:处理长按并拖动以选择另一个按钮。 (如键盘)

    我很难找到有关如何处理触摸事件以支持与键盘类似的行为的正确文档 我想要的是一个按钮 当我长按它时 它会在按钮上方显示一个自定义视图控制器 但我希望用户能够将手指拖动到其他按钮之一 无需将手指离开屏幕 我长按按钮 它是自定义视图控制器的所有设
  • 上下文是只读的

    Helo大师 我必须动态创建一个JNDI数据源 我尝试使用名为SetupApplicationListener的侦听器来完成它 这是开始WEB LIB web xml
  • 将参数从 pug 传递到 JSX

    我正在使用 Express 和 React 构建游戏 我需要访问我的 userIdindex jsx文件来在我的控制器上执行操作 例如增加用户分数 我的路线呈现index pug文件同时传递user id param server js a
  • 具体时间通知

    我在特定时间收到通知 请参阅我的代码 Create alarm manager AlarmManager alarmMgr0 AlarmManager getSystemService Context ALARM SERVICE Creat
  • JavaScript 字符串换行符是什么?

    Is nJavaScript 中适用于所有平台的通用换行符序列 如果不是 我如何确定当前环境的特征 我不是在询问 HTML 换行元素 br 我问的是 JavaScript 字符串中使用的换行符序列 我刚刚使用这段愚蠢的 JavaScript
  • 如何让我的 Android 应用程序出现在超省电模式下

    一些三星设备具有超省电模式 可以关闭 wifi 将屏幕变成灰度并限制使用一些基本应用程序 但是 它确实允许您添加一些可以使用的应用程序 这些应用程序包括 Facebook 和 WhatsApp 如何让我的应用程序出现在此列表中 我必须对应用
  • ajax响应错误(XML解析错误:找不到元素位置:moz-nullprincipal)

    我无法得到 ajax 的响应 请指导我如何解决此错误 我从已签入的服务器成功返回数据小提琴网络调试器并且 ajax 仍然显示错误 XML 解析错误 找不到元素位置 moz nullprincipal 6b0a1ac2 50ab 4053 9
  • 如何在 Rails 视图中注释代码?

    当我使用 Rails 并开发视图时 我经常想注释掉代码 类和模型足够简单 但是views有点棘手 在视图中注释代码的最佳方式是什么 这样它就不会被任何东西解释 HTML 给了我们尽管这里包含的代码似乎无论如何都会被解释 或者还有更 Rail
  • Flutter FCM onBackgroundMessage 处理程序给出 null 检查错误

    我正在尝试为我的应用程序实现通知 但是在初始化通知时FirebaseMessaging onBackgroundMessage notificationHandler 给出错误 Error E flutter 28265 错误 flutte
  • JVM 在 Ubuntu 上尝试打开 JavaFX 保存对话框或打开对话框时崩溃

    在 Windows 中一切正常 我只是使用 JavaFX 和 Java 1 8 0 131 从操作系统中选择文件 A fatal error has been detected by the Java Runtime Environment
  • Selenium 登录测试不接受 pytest 设备登录或拒绝连接

    我变得绝望 因为我似乎找不到一个我认为每个人都会使用的解决方案 我想使用 selenium 和 pytest 以及 live server url 来测试简单的登录 根据 pytest django 文档 一个简单的固定装置称为live s
  • Gradle Kotlin DSL:如何使用 typesafe api 配置子项目

    摇篮6 1 1 我一直在尝试使用 Kotlin DSL 转换我的项目的 Gradle 文件类型安全方式但到目前为止失败了 我的所有项目都是用 Java 进行的多项目构建 这个想法是分解 删除子模块的常见配置 无论是在根模块的 子项目 块中还
  • Razor Pages 与服务器端 Blazor

    用于服务器端 Web 应用程序 就像过去的美好时光一样 Blazor https learn microsoft com en us aspnet core blazor view aspnetcore 3 1旨在提供流行 JavaScri
  • 在knitr中,for循环中的pander没有输出

    在 RStudio 中使用 knit pander 在 for 循环中不会生成任何 或正确的 html 输出 这是一个最小的情况 作为 Rmd 输入文件 title Untitled output html document Testing
  • doFilter() 是在 Servlet 工作完成之前还是之后执行?

    The javax servlet Filter http java sun com j2ee sdk 1 3 techdocs api javax servlet Filter html对象既可用于身份验证 其中 Filter 需要在需要
  • 如何在 React Native 中隐藏和显示导航栏?

    我正在传递 props 当滚动特定高度时 我正在传递 paramsshowHeader True 因此 当我滚动时 标题是不透明的 最初它是透明的 因此 在用户滚动回顶部后 我希望标题再次透明 但它是不透明的 我该如何解决这个问题 Code
  • Google 文档 - 实时访问文本更改

    Goal 我们的用户在 Google 文档中工作 他们编写的文本将在他们输入时使用文本转语音朗读给他们听 它应该能够跨尽可能多的平台和浏览器工作 我们的解决方案 这似乎适合谷歌应用脚 本 https developers google co