0

我正在尝试创建一个谷歌文档,该文档根据 Word 文档自动填充作者、文档名称、创建日期和修改日期。

当我在脚本编辑器中运行以及通过添加的菜单项触发但不会触发 onOpen 时,我有一个正在运行的脚本。

这就是我访问信息的方式:

  var document = DocumentApp.getActiveDocument();
  var body = DocumentApp.getActiveDocument().getBody();
  var bodyText = body.editAsText();
  var docID = document.getId();
  var docName = document.getName();
  var file = DocsList.getFileById(docID);
  var docCreated = file.getDateCreated().toString();
  var docUpdated = file.getLastUpdated().toString();

然后我只是在文档中做一些查找替换。似乎什么都没有追

var docName = document.getName();

是否需要触发 getName() 方法?我想避免用户必须单击按钮来更新文档。

感谢任何帮助。

米奇

4

1 回答 1

1

您可以onOpen()通过在打开文档后立即打开脚本编辑器,选择“查看 - 执行脚本”来检查触发器函数的执行记录。

在那里,你会发现这样的东西:

[13-08-01 11:53:18:163 EDT] Document.getName() [0 seconds]
[13-08-01 11:53:18:203 EDT] Execution failed: No item with the given ID could be found, or you do not have permission to access it. (line 41, file "Code") [0.052 seconds total runtime]

根据了解触发器,简单触发器不应该允许执行需要身份验证的服务。该限制似乎不适用于Document.getName(),尤其是在Document.getId()成功运行之后。对此存在问题,请访问问题 3083并为其加注星标以投票和接收更新。

您会在 DocsList 方法调用中发现类似的问题,但它们并未包含在Google Apps 脚本安全模型中,因此它们被阻止也就不足为奇了。

作为一种变通方法,您可以onOpen()提醒用户设置文档变量,直到他们这样做。

function onOpen(e) {
  DocumentApp.getUi().createMenu('Menu')
      .addItem('Set variables', 'setVars')
      .addToUi();

  var doneFirstRun = ScriptProperties.getProperty('doneFirstRun');
  if (doneFirstRun == null) {
    var ui = DocumentApp.getUi();
    ui.alert( "Set document variables\n\n"
             +"Select Menu - Set variables");
  }
}

function setVars() {
  var ui = DocumentApp.getUi();
  var document = DocumentApp.getActiveDocument();
  var body = document.getBody();
  var bodyText = body.editAsText();
  var docID = document.getId();
  var url = document.getUrl();
  var docName = document.getName();     // Does not work in onOpen
  var editors = document.getEditors();  // Does not work in onOpen
  var viewers = document.getViewers();  // Does not work in onOpen
  var file = DocsList.getFileById(docID);
  var docCreated = file.getDateCreated().toString();
  var docUpdated = file.getLastUpdated().toString();  

  // ... do actual work here

  // Completed setting document variables - disable reminder.
  var doneFirstRun = ScriptProperties.setProperty('doneFirstRun',true);

  ui.alert("Completed");  
}
于 2013-08-01T16:49:24.233 回答