我的脚本中有以下代码(不包含并从头开始),但由于某种原因,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]);
}
}
}
我确信我错过了一些基本的东西。
答案 0 :(得分:0)
我的代码的问题是它没有预期对话框被启动的异步线程。一旦这些对话被“显示”,程序继续执行文件选择之前的doMerge()方法(这会导致无效的参数错误)。
解决方案是通过事件处理程序链接程序流。所以第一个处理程序的结尾创建第二个对话框,第二个处理程序的结尾调用doMerge()方法。
我发现的一个特点就是它没有在编辑器中运行。运行脚本的唯一方法是将其部署为webapp。我怀疑这是因为UI服务不是可用的类,或者编辑器不支持UI交互。