以编程方式临时更改Google文档,然后替换为预先更改的版本

时间:2016-07-28 22:32:01

标签: javascript jquery google-docs bookmarklet

我正在尝试执行以下操作,这似乎是一项简单的任务。在尝试各种方法2周后,我仍然在第4步失败:

  1. 从现有的Google Doc(Gdoc)文件开始,
  2. 以编程方式接受所有建议的更改,
  3. 然后将文件导出为文本文件(此步骤快速完成),
  4. 然后撤消临时更改,以使该文件与步骤1中的文件相同。
  5. 我的方法(参见附件代码)是将JavaScript(我已制作成书签)写入:

    1. 保存原始Gdoc的内容(步骤1中的版本),
    2. 然后接受建议的更改(这里真正的救生员,顺便说一下:http://www.tcg.com/blog/accept-all-bookmark-for-google-docs-suggestions/
    3. 以纯文本形式在本地导出文件(全局接受建议的更改允许将这些编辑合并到文本中!)
    4. 将文档还原为已保存的版本。
    5. 以下是Javascript代码。我的问题是:为什么我的方法不是通过sessionStorage.setItem保存原始文件内容,然后检索它以在最后一步恢复文档,不工作? (在此上下文中“不工作”意味着在运行脚本后查看文档时,“建议的更改”不会像原始文档中那样返回到“建议”)。

      除了sessionStorage.setItem方法之外,我还尝试了很多其他方法,包括将document.getElementsByClassName("*stuff*").innerHTML.outerHTML, .innerTEXT, .outerTEXT存储在变量 inH,outH,inT,outT,分别在脚本的开头,然后将document.getElementsByClassName("*stuff*").innerHTML, outerHTML, innerTEXT, .outerTEXT等同于 inH,outH ,resp。没工作。 (“ stuff ”是“docos-icon-accept-suggestion-checkmark”,btw)

      我还尝试通过克隆document.getElementsByClassName("*stuff*")来制作backupD = document.getElementsByClassName("*stuff*").cloneNode(true)的“备份副本”:document.getElementsByClassName("*stuff*").replaceWith(backupD)然后通过.getElementsByClassName("*stuff*")进行恢复无法正常工作。

      除了javascript:(function() {sessionStorage.setItem("backup",document.getElementsByClassName("docos-icon-accept-suggestion-checkmark")); var d = document.getElementsByClassName("docos-icon-accept-suggestion-checkmark"); d = Array.prototype.slice.call(d); var cnt = 0; d.forEach(function(n){ var e = document.createEvent("MouseEvents"); e.initEvent("click", true, false); n.dispatchEvent(e,true); e = document.createEvent("MouseEvents"); e.initEvent("mousedown", true, false); n.dispatchEvent(e,true); e = document.createEvent("MouseEvents"); e.initEvent("mouseup", true, false); n.dispatchEvent(e,true); cnt++; }); alert('JUST ACCEPTED ALL SUGGESTED EDITS: ' + cnt.toString()); document.getElementsByClassName("docos-icon-accept-suggestion-checkmark").replaceChild(sessionStorage.setItem("backup")); alert('JUST FINISHED RESTORING TO ORIGINAL FILE');}) (); 之外的其他东西是否可能存储在我用来恢复Gdoc之后?我正在使用上面的节点,因为它是用于全局接受建议的更改,这似乎是“撤消”该过程的相关事项。

      说到“撤消”,我还尝试以编程方式“撤消”以恢复所有已接受的建议更改。我的代码知道需要引发“撤消”的次数(当我多次手动点击Gdocs菜单上的撤消箭头时,我会收回原始文档),但我找不到任何关于如何“撤消”按钮在Gdoc中实现,以及如何以编程方式“命中”撤消按钮。

      最后,我想到的另一个替代方案(我的第一个想法是探索)是以某种方式以编程方式在Google云端硬盘上制作GDoc的副本(可能有很多指导要做到这一点),然后使用它复制为我的“临时副本”,用于接受所有建议的更改,以便我不必担心将原始内容还原到文件。但是存在的障碍是,当我启动这个javascript时,它会在我点击书签时打开的文件上运行,没有任何明显的方式打开,然后“接受所有建议的更改”复制的文件。

      这是我的代码(无法将Gdoc恢复到其原始状态)。在做全局“接受所有建议的更改”之前,我应该采用什么方法来使我的Gdoc达到其原始状态的任何建议将非常感激:

      {{1}}

      一些可能有用/相关的链接:

      • scripting a google docs form submission (有关Javascript如何从打开的“永久”文件运行的问题,能够打开克隆文档 - 该脚本可能会复制并上传文档而不会出现问题,但是)。
      • Programmatically edit a Google doc with JavaScript (与我的问题非常相关,但答案暗示如果没有Google Apps脚本就无法更改Gdoc内容,我觉得这很困惑,因为我确实能够“接受建议的更改”并更改文档的明显内容。我对Google Apps的尝试遇到了与现有javascript相同的问题:我与打开的文档绑定,无法以编程方式打开和操作其他文档。此外,我无法获得Google用于执行接受所有建议的脚本的应用程序。)
      • How to clone (and restore) a DOM subtree(其中一个引用我从中得到了使用.cloneNode的想法,这被证明是我项目的另一个死胡同)。

2 个答案:

答案 0 :(得分:0)

以下编写为bookmarklet的JavaScript实现了上述所有目标,以防此解决方案可以帮助其他人同样希望暂时“接受Google文档中的所有建议更改”,然后将文档还原为原始状态。如果您在执行本答案底部给出的Bookmarklet时显示了Google文档,则具体步骤及其完成方式如下。

  1. 以编程方式接受所有建议的更改。 (来自http://www.tcg.com/blog/accept-all-bookmark-for-google-docs-suggestions/的算法):

    var d=document.getElementsByClassName("docos-accept-suggestion"); d = Array.prototype.slice.call(d); d.forEach(function(n){ var e = document.createEvent("MouseEvents");  e.initEvent("click", true, false);  n.dispatchEvent(e,true); e = document.createEvent("MouseEvents");  e.initEvent("mousedown", true, false);  n.dispatchEvent(e,true); e = document.createEvent("MouseEvents");  e.initEvent("mouseup", true, false);  n.dispatchEvent(e,true); });
    
  2. 以编程方式导出纯文本(现在应该包含建议的更改):

    window.open(window.location.href.replace("edit","export\?format=txt"));
    
  3. 使用Google Doc和/或导出的纯文本文件(例如,我的文件有原始LaTeX,所以我编译了文件并得到了我的研究论文的pdf)。

  4. 将Doc切换回原来的pre-accept_all_suggested_changes状态。

    w=window.open(window.location.href.replace("edit","copy"));w.addEventListener('load',w.close(),true);alert('Check your download folder for the text file');setTimeout(function(){var a=document.getElementsByClassName("docs-icon-undo")[0]; for(var j=0; j<cnt; j++){e=document.createEvent("MouseEvents"); e.initEvent("click",true,false);a.dispatchEvent(e,true);e=document.createEvent("MouseEvents");e.initEvent("mousedown",true,false); a.dispatchEvent(e,true);e=document.createEvent("MouseEvents");e.initEvent("mouseup",true,false);a.dispatchEvent(e,true)}}
    
  5. (其中cnt是上一步中接受的建议更改数量。代码为您计算cnt的值。)

    完全,功能小书签如下所示(其中“[DO STUFF]”是您放置所需代码的地方,其中包含使用Google Doc或纯文本文件的所有建议更改):

    javascript:(function(){var d=document.getElementsByClassName("docos-accept-suggestion"); d = Array.prototype.slice.call(d); d.forEach(function(n){ var e = document.createEvent("MouseEvents");  e.initEvent("click", true, false);  n.dispatchEvent(e,true); e = document.createEvent("MouseEvents");  e.initEvent("mousedown", true, false);  n.dispatchEvent(e,true); e = document.createEvent("MouseEvents");  e.initEvent("mouseup", true, false);  n.dispatchEvent(e,true); });window.open(window.location.href.replace("edit","export\?format=txt")); [*DO STUFF*]; w=window.open(window.location.href.replace("edit","copy"));w.addEventListener('load',w.close(),true);alert('Check your download folder for the text file');setTimeout(function(){var a=document.getElementsByClassName("docs-icon-undo")[0];for(var j=0; j<cnt; j++){e=document.createEvent("MouseEvents"); e.initEvent("click",true,false);a.dispatchEvent(e,true);e=document.createEvent("MouseEvents");e.initEvent("mousedown",true,false); a.dispatchEvent(e,true);e=document.createEvent("MouseEvents");e.initEvent("mouseup",true,false);a.dispatchEvent(e,true)}},5000);})();
    

    该代码已在Chrome浏览器上测试过。

答案 1 :(得分:0)

Google 文档(在 Chrome 中)现在有一个工具可以预览文档并应用所有建议的编辑: Tools --> Review suggested edits --> Preview "accept all"

虽然导出文档不反映预览,但可以打印和复制粘贴文档并应用建议的编辑,以便获得应用建议编辑的纯文本或 pdf 版本的文档。