Google apps script 复制文档和更新字段,但出现错误:";服务不可用:Docs";

Google apps script 复制文档和更新字段,但出现错误:";服务不可用:Docs";,google-apps-script,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

我有一个脚本,它获取模板,复制模板,然后用电子表格中的数据替换某些字段。昨天它运行得很好,但今天我发现了一个错误:

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

我没有碰过代码,但是突然出现了这个错误。你知道为什么吗

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"));
顺便说一句,当我在线搜索此错误时,所有与表相关的讨论都会出现,但我不会在这个脚本中复制或创建任何表


感谢您的帮助!

现在肯定是
DocsList.find()
有一个bug。已经出现了,请启动它,并希望引起注意

考虑来自名为“WTF”的独立脚本的以下代码段:

以下是日志包含的内容:

[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
因此,我们不能总是信任
DocsList.find()。正如@Sergeinsas指出的,
find()
应该返回所有包含`查询文本'的文件,因此相信我们的文件名是唯一匹配项是不可靠的

为了确保文件名匹配,这里有一个变通帮助函数:

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

此时,
DocsList.find()
中肯定有一个bug。已经出现,请启动它,并希望引起注意

考虑来自名为“WTF”的独立脚本的以下代码段:

以下是日志包含的内容:

[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
因此,我们不能总是信任
DocsList.find()。正如@Sergeinsas指出的,
find()
应该返回所有包含`查询文本'的文件,因此相信我们的文件名是唯一匹配项是不可靠的

为了确保文件名匹配,这里有一个变通帮助函数:

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

Mogsdad,你是一个真正的战士。感谢你在这些社区投入的所有时间和精力。我现在只自学了4天的脚本编写,我一直遵循着你和Serge经常发布的答案,包括我自己的一些问题。你们太棒了

我将尝试一下您的解决方法。此外,我在此页面上找到了一些代码:

使用此示例,我将脚本修改为以下内容。我已经运行了几次,它工作正常。但是,我必须在几天内运行几次,以确保错误不会重新出现

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

Mogsdad,你是一个真正的战士。感谢你在这些社区投入的所有时间和精力。我现在只自学了4天的脚本编写,我一直遵循着你和Serge经常发布的答案,包括我自己的一些问题。你们太棒了

我将尝试一下您的解决方法。此外,我在此页面上找到了一些代码:

使用此示例,我将脚本修改为以下内容。我已经运行了几次,它工作正常。但是,我必须在几天内运行几次,以确保错误不会重新出现

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


它现在可以工作了吗?那…现在呢?我看到它有时会作为一个瞬态出现。在过去的一个小时里,我已经运行了大约100次,希望它能马上消失,但没有运气!有些东西坏了。我添加了
var name=file.getName();
在代码的第一行之后,发现结果是脚本文件,而不是命名的模板
我收到一条奇怪的错误消息,说必须先将
文件WTF转换为Google文档。
我以前从未见过这种情况。好的,所以我刚刚注意到,在我的驱动器文件夹中,它显示了一个脚本文件的副本,该文件的文件名用于文档模板的副本。Yikes。好的,今天早上它工作正常。Serge,你在吗?你知道为什么会这样吗?脚本每周都会运行,所以我必须相信它每次都会运行。谢谢你的时间。它现在运行了吗?怎么样…现在?我看到它有时会作为一个临时出现。我在过去的一个小时内运行了大约100次,希望它会消失,但没有运气!有些东西坏了。我在代码的第一行之后添加了
var name=file.getName();
,并发现结果是脚本文件,而不是命名模板
我收到一条奇怪的错误消息,说必须先将
文件WTF转换为Google文档。
我以前从未见过这种情况。好的,所以我刚刚注意到,在我的驱动器文件夹中,它显示了一个脚本文件的副本,该文件的文件名用于文档模板的副本。Yikes。好的,今天早上它工作正常。Serge,你在吗?知道为什么会发生这种情况吗?脚本将每周运行一次,所以我必须相信它每次都会运行。感谢你的时间。这一次(也是这一次)我不同意你的意见…如果你参考文档列表。find('query'))返回容器中包含给定字符串的所有文件的数组。这并不意味着名为query的文件,而是包含“query”,所以我想这不是一个bug,而是预期的行为。至少这是它长期以来的工作方式和我一直以来的使用方式。请参阅Corey G的这篇文章,其中使用了此功能:附带问题:为什么要这样做新创建的文件是否显示“上次修改”的时间,即我所在时区前3小时?Google拥有一个Tardis(或检查您的所有区域设置-帐户、文件等)。@Sergeinsas-同意这些文档-我真不愿意只关注文件名。已编辑。但是,
find()
并不总能找到正在运行的脚本。(我刚刚重新运行了上面的代码,它已恢复为不再找到源脚本。Corey的示例目前也不适用于我。)此外,我的搜索结果中的第三个文档不包含字符串“Testdoc”(它确实包含“Testdoc BLOB”),这意味着模糊搜索……但它遗漏了包含以下内容的其他文件:“这是一个测试文档。”这一次(和f