调用saveAndClose后如何重新打开活动文档?

时间:2018-06-15 12:26:23

标签: google-apps-script google-docs

我想知道在调用saveAndClose后如何重新打开活动文档。

我有一个Google文档插件(Magic Rainbow Unicorns),可以将每个选定字符的字体颜色更改为彩虹的不同颜色。如果文档很长(例如100页),那么我会看到以下错误:

  

ScriptError:在保存文档之前应用了太多更改。请   然后使用Document.saveAndClose()保存较小批次中的更改   使用Document.openById()重新打开文档。

根据另一个SO answer的建议,我有一个计数器,并且在50000更改后正在进行刷新。

      // save & flush changes
      if (rainbowIndex%50000 == 0) {
        DocumentApp.getActiveDocument().saveAndClose();
        // reopen the doc and refresh the selection
        selection = DocumentApp.getActiveDocument().getSelection();
        elements = selection.getRangeElements();
      }

但是这段代码不起作用,因为每当我尝试修改元素时,我都会看到错误Document is closed, its contents cannot be updated.

我无法按照错误消息的建议使用DocumentApp.openById,因为我的加载项只有当前文档的权限(@OnlyCurrentDoc)。

所以我想知道的是:如果关闭它之后可以重新打开活动文档,因为我不想更改我的加载项的权限?如果可能,我应该拨打哪种方法?

1 个答案:

答案 0 :(得分:0)

感谢filipeglfw指出了一个对他有用的代码片段,我在代码中发现了一个错误。我已经刷新了活动文档,选区和选区中的元素,但没有刷新我当前正在使用的元素。

下面显示了工作代码段:

/**
 * @OnlyCurrentDoc
 *
 * The above comment directs Apps Script to limit the scope of file
 * access for this add-on. It specifies that this add-on will only
 * attempt to read or modify the files in which the add-on is used,
 * and not all of the user's files. The authorization request message
 * presented to users will reflect this limited scope.
 */

function test() {
  var document = DocumentApp.getActiveDocument();
  var selection = document.getSelection();
  if (selection) {
    var elements = selection.getRangeElements();
    // go through each selected item and change the font colour
    var rainbowIndex = 0;
    for (var i = 0; i < elements.length; i++) {
      var element = elements[i].getElement();
      var elementText, startIndex, endIndex;
      if (elements[i].isPartial()) {
        // they selected only part of a paragraph
        elementText = element.asText();
        startIndex = elements[i].getStartOffset();
        endIndex = elements[i].getEndOffsetInclusive() + 1;
      } else {
        // they selected whole paragraph(s)
        elementText = element.editAsText();
        startIndex = 0;
        endIndex = selectedText.length;
      }
      for (var j=startIndex; j<endIndex; j++) {
        elementText.setForegroundColor(j, j, "#CCCCCC");
        rainbowIndex++;
        // save & flush changes
        if (rainbowIndex%5 == 0) {
          document.saveAndClose();
          // reopen the doc and refresh the selection
          var document = DocumentApp.getActiveDocument();
          selection = document.getSelection();
          elements = selection.getRangeElements();
          element = elements[i].getElement();
          elementText = element.asText();
        }
      }
    }
  } else {
    // there was no selection
    throw 'Please select some text.';
  }
}

请注意,我为刷新计数器使用了一个较小的数字(5),但我认为应该约为50000。