复制文档和更新字段,但错误:“服务不可用:文档”

时间:2013-12-06 01:16:24

标签: google-apps-script

我有一个脚本可以抓取模板,复制它,然后用电子表格中的数据替换某些字段。它昨天工作得很漂亮,但今天我收到了这个错误:

“服务不可用:文档”(参考我在 * 下面的行

我没有触及代码,但突然出现此错误。有什么想法吗?

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"));

顺便说一下,当我在网上搜索这个错误时,所有讨论都与表有关,但我不是在这个脚本中复制或创建任何表。

感谢您的帮助!

2 个答案:

答案 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)

莫格达德,你是一个真正的战士。感谢您投入这些社区的所有时间和精力。我现在只教自己编写了4天的脚本,而且我已经按照你和Serge定期发布的答案生活,包括我自己的一些问题。你们摇滚。

我会试一试你的解决方法。另外,我在此页面上找到了一些代码:

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"));