我想知道在调用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
)。
所以我想知道的是:如果关闭它之后可以重新打开活动文档,因为我不想更改我的加载项的权限?如果可能,我应该拨打哪种方法?
答案 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。