Google App-Script DocsListDialog.showDocsPicker()不会执行

时间:2013-11-30 19:30:40

标签: google-apps-script google-sheets google-docs

我的脚本中有以下代码(不包含并从头开始),但由于某种原因,showDocsPicker()函数什么都不做。没有对话框,从不调用事件处理程序,日志或屏幕上没有错误。当我调试时,选择器对象似乎有效。

function mailMerge() {
  var app = UiApp.createApplication().setTitle("Spreadsheet-Doc Merge");

  var docPicker = app.createDocsListDialog().setDialogTitle("Pick Document").setInitialView(UiApp.FileType.DOCUMENTS);
  docPicker.addSelectionHandler(app.createServerHandler("docHandler"));
  Logger.log("Pick Doc");
  docPicker.showDocsPicker();

  var ssPicker = app.createDocsListDialog().setDialogTitle("Pick Spreadsheet").setInitialView(UiApp.FileType.SPREADSHEETS);
  ssPicker.addSelectionHandler(app.createServerHandler("ssHandler"));
  Logger.log("Pick ss");
  ssPicker.showDocsPicker();

  doMerge();

  return app;
}

function docHandler(e) {
  Logger.log("docHandler Event");
  var app = UiApp.getActiveApplication();
  selectedDocId = e.parameter.items[0].id;
  UserProperties.setProperty("docId", e.parameter.items[0].id);
  Logger.log("Selected doc: " + e.parameter.items[0].id);

  return app;
}

function ssHandler(e) {
  Logger.log("ssHandler Event");
  var app = UiApp.getActiveApplication();
  UserProperties.setProperty("spreadsheetId", e.parameter.items[0].id);
  selectedSpreadsheetId = e.parameter.items[0].id;
  Logger.log("Selected spreadsheet: " + e.parameter.items[0].id);

  return app;
}

function doMerge() {
  var docId = UserProperties.getProperty("docId");
  Logger.log("UserProperties.getProperty docId: " + UserProperties.getProperty("docId"));
  var spreadsheetId = UserProperties.getProperty("spreadsheetId");
  Logger.log("UserProperties.getProperty spreadsheetId: " + UserProperties.getProperty("spreadsheetId"));

  var sheet = SpreadsheetApp.openById(spreadsheetId);
  var text = DocumentApp.openById(docId).getBody().editAsText();

  var rows = sheet.getDataRange();
  var numRows = rows.getNumRows();
  var values = rows.getValues();
  var fieldNames = values[0];

  for (var i = 1; i < numRows; i++) {
    var row = values[i];
    Logger.log("Processing row " + i + ": " + row);

    for (var f = 0; f < fieldNames.length; f++) {

      text.replaceText("\\[" + fieldNames[f] + " " + i + "\\]", row[f]);
    }
  }
}

我确信我错过了一些基本的东西。

1 个答案:

答案 0 :(得分:0)

我的代码的问题是它没有预期对话框被启动的异步线程。一旦这些对话被“显示”,程序继续执行文件选择之前的doMerge()方法(这会导致无效的参数错误)。

解决方案是通过事件处理程序链接程序流。所以第一个处理程序的结尾创建第二个对话框,第二个处理程序的结尾调用doMerge()方法。

我发现的一个特点就是它没有在编辑器中运行。运行脚本的唯一方法是将其部署为webapp。我怀疑这是因为UI服务不是可用的类,或者编辑器不支持UI交互。