【问题标题】:Is there a way to use Google Apps Script to open a document at the last edit?有没有办法使用 Google Apps 脚本在上次编辑时打开文档?
【发布时间】:2020-05-30 04:50:35
【问题描述】:

我有一个有点长的 Google 文档。我用它来收集我对不同项目的几乎所有想法,所以我希望它在我离开的地方打开备份(不一定在最后)。 - 我需要在我使用的任何设备上轻松访问它,这就是为什么它是 Doc 而不是 Word 文件的原因,即使我知道如何在那里编写宏。 -

经过一番挖掘,看起来有一个用于工作表的编辑触发器,但没有用于文档,所以我一直在尝试获取基于时间的触发器,而不是作为最近编辑的最佳近似值。我在文档的 Code.gs 中写了以下内容,但它似乎不起作用。有什么建议吗?

function onOpen() { 
  deleteTrigger();
  createTrigger();
  DocumentApp.getActiveDocument().setCursor(PropertiesService.getDocumentProperties().getProperty('lastOpen')); 
}

function createTrigger() {
  ScriptApp.newTrigger('savePlace')
      .timeBased()
      .everyMinutes(1)
      .create();
} 

function savePlace() {
  PropertiesService.getDocumentProperties().setProperty('lastOpen', DocumentApp.getActiveDocument().getCursor());
}

function deleteTrigger() {

  // Loop over all triggers and delete them
  var allTriggers = ScriptApp.getProjectTriggers();

  for (var i = 0; i < allTriggers.length; i++) {
    ScriptApp.deleteTrigger(allTriggers[i]);
  }
}

(另外,我是否必须在对话框中为 lastOpen 指定一个脚本属性?如果是这样,最好的值是什么。[我真的,真的对此很陌生])

【问题讨论】:

    标签: google-apps-script google-docs triggers


    【解决方案1】:

    试试这个:

    离开时只需保存您的书签。以及打开文档时使用 gotoBookMark。

    function saveBookMark() {
      var doc=DocumentApp.getActiveDocument();
      var cursor=doc.getCursor();
      var bookmark=doc.addBookmark(cursor);
      var ps=PropertiesService.getDocumentProperties();
      ps.setProperty('bookmarkid', bookmark.getId());
    }
    
    function gotoBookMark() {
      var doc=DocumentApp.getActiveDocument();
      var bookmarkid=PropertiesService.getDocumentProperties().getProperty('bookmarkid');
      var pos=doc.getBookmark(bookmarkid).getPosition();
      doc.setCursor(pos);
    }
    

    这将删除所有书签:

    function clearBookMarks() {
      var doc=DocumentApp.getActiveDocument();
      var bkmarks=doc.getBookmarks().forEach(function(bm){bm.remove();})
    }
    

    这是菜单:

    function menu() {
      DocumentApp.getUi().createMenu('MyMenu')
      .addItem('Save BookMark', 'saveBookMark')
      .addItem('Goto Bookmark', 'gotoBookMark')
      .addItem('Remove All Bookmarks', 'clearBookMarks')
      .addToUi();  
    }
    

    Class Bookmarks

    我以前从未真正使用过它,但我想通过一些额外的努力,可以发布每个书签的摘录并提供一个复选框来选择它们,然后只删除你不想要的那些并提供一个按钮放在每一个旁边,这样您就可以随时返回到那个。

    这是让我滚动的示例代码:

    // Insert a bookmark at the cursor position and log its ID.
    var doc = DocumentApp.getActiveDocument();
    var cursor = doc.getCursor();
    var bookmark = doc.addBookmark(cursor);
    Logger.log(bookmark.getId());
    

    之后,您可以使用代码完成来找出可用的方法,然后在必要时参考手册。有趣的是,有时代码完成会在文档之前更新,有时文档会先更新,因此您有时必须愿意花点时间了解它。

    我使用文档属性服务来保存最后一个书签 ID,因此当您打开文档时,它总是会转到最后一个书签。

    PropertiesService

    【讨论】:

    • 我尝试了您的代码并对我的代码进行了更多调试,但它们似乎都在 getCursor 上返回 null。有什么建议吗?
    • 您是否将其放入 Google 文档中?
    • 我刚刚打开了一个最近有人发给我的新文档,我将答案中的代码复制到了脚本编辑器中。设置一个 onOpen() 函数并将 menu() 放入其中并运行它以创建菜单并授权脚本,它开箱即用。尝试从脚本编辑器中独立运行该函数,看看是否发现了一些问题
    • 我用过的两个文档都在运行V8
    猜你喜欢
    • 1970-01-01
    • 2021-12-16
    • 2020-03-24
    • 1970-01-01
    • 1970-01-01
    • 2019-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多