我有一个脚本可以抓取模板,复制它,然后用电子表格中的数据替换某些字段。它昨天工作得很漂亮,但今天我收到了这个错误:
“服务不可用:文档”(参考我在 * 下面的行
我没有触及代码,但突然出现此错误。有什么想法吗?
var file = DocsList.find("my TEMPLATE")[0];
var copy = file.makeCopy("my DOCUMENT");
var copyId = copy.getId(); //***This is the line the error points to
var docCopy = DocumentApp.openById(copyId);
var body = docCopy.getBody();
body.replaceText('{date}', Utilities.formatDate(new Date(sheet.getRange('A1').getValues()), "GMT", "MMM dd"));
顺便说一下,当我在网上搜索这个错误时,所有讨论都与表有关,但我不是在这个脚本中复制或创建任何表。
感谢您的帮助!
答案 0 :(得分:0)
目前肯定存在DocsList.find()
的错误。 Issue 3470已被提出,请为其注明并希望得到一些关注。
从名为“WTF”的独立脚本中考虑此片段:
function myFunction() {
var files = DocsList.find("Testdoc");
for (var f in files) {
// All files found MUST be named the same, right?
Logger.log(files[f].getName());
}
}
以下是日志包含的内容:
[13-12-06 09:46:07:836 EST] WTF
[13-12-06 09:46:07:836 EST] Testdoc <<<<<<< That's the one!
[13-12-06 09:46:07:837 EST] Doc from Doc
这是相同的搜索,在当天晚些时候运行。请注意,源脚本不再在列表中...使用此结果,项[0]
将包含我们要查找的文件:
[13-12-06 17:11:08:481 EST] Testdoc
[13-12-06 17:11:08:482 EST] Doc from Doc
所以我们不能总是信任DocsList.find(). As @Sergeinsas points out,
find()should be returning all files that
包含查询文本 - 所以相信我们的文件名是唯一的匹配是不可靠的。
为了确保文件名匹配,这是一个解决方法的辅助函数:
function docFind(filename) {
var files = DocsList.find(filename);
for (var f in files) {
if (filename === files[f].getName()) return files[f];
}
// Not found
return null;
}
这样,只需更改一行,代码即可:
var file = docFind("my TEMPLATE");
var copy = file.makeCopy("my DOCUMENT");
var copyId = copy.getId(); //***This is the line the error points to
var docCopy = DocumentApp.openById(copyId);
var body = docCopy.getBody();
body.replaceText('{date}', Utilities.formatDate(new Date(sheet.getRange('A1').getValues()), "GMT", "MMM dd"));
答案 1 :(得分:0)
我会试一试你的解决方法。另外,我在此页面上找到了一些代码:
http://tjhouston.com/2012/03/merge-info-from-google-forms-to-pdf-document-and-send-via-email/1
使用此示例,我将脚本修改为以下内容。我已经运行了几次,它运行正常。但是,我必须在几天内运行它几次,以确保错误不会再次出现。
var docTemplate = "[insert template doc key here]"; //this one uses the document key, not the file name like mine did
var copy = DocsList.getFileById(docTemplate).makeCopy("my DOCUMENT");
var copyId = copy.getId();
var copyDoc = DocumentApp.openById(copyId);
var body = copyDoc.getActiveSection();
body.replaceText('{date}', Utilities.formatDate(new Date(sheet.getRange('A1').getValues()), SpreadsheetApp.getActive().getSpreadsheetTimeZone(), "MMM dd"));