いくつかのテキストボックスといくつかのボタンだけのシンプルなUIを作成しました。コンセプトは基本的に、私が管理しているスプレッドシートの投票アプリのコンセプトです。スクリプトが実行されると、スプレッドシートの各行がテキストボックスに表示され、ユーザーがそのアイテムに投票できるようになります。UIを手動で作成しました。
function BuildUI() {
var app = UiApp.createApplication().setTitle("Voting Machine").setWidth(700);
var doc = SpreadsheetApp.getActiveSpreadsheet();
var buttonWidth = "125px";
// Panels
var mainPanel = app.createVerticalPanel();
var horzPanel = app.createHorizontalPanel();
var buttonGrid = app.createGrid(1,3);
// Textboxes
var txtCat = app.createTextBox().setName("txtCat").setId("txtCat");
var txtIdea = app.createTextBox().setName("txtIdea").setId("txtIdea");
// Handlers
var handler = app.createServerHandler();
handler.setCallbackFunction("recordVote");
handler.addCallbackElement(txtCat).addCallbackElement(txtIdea);
// Buttons
var voteNo = app.createButton("No").setId("voteNo")
.addClickHandler(handler).setWidth(buttonWidth);
var voteMaybe = app.createButton("Maybe").setId("voteMaybe")
.addClickHandler(handler).setWidth(buttonWidth);
var voteYes = app.createButton("Yes").setId("voteYes")
.addClickHandler(handler).setWidth(buttonWidth);
horzPanel.add(txtCat).add(txtIdea)
buttonGrid.setWidget(0, 0, voteNo)
.setWidget(0, 1, voteMaybe)
.setWidget(0, 2, voteYes);
mainPanel.add(horzPanel).add(buttonGrid);
app.add(mainPanel);
doc.add(app);
}
問題は、NextIdea関数を呼び出すと、次のエラーが発生することです。
function NextIdea() {
var app = UiApp.getActiveApplication();
... Get the next row of the spreadsheet ...
app.getElementById("txtCat").setText("TestValue"); // <--- This is the error line
テキストボックスにテキストを設定しようとすると、「オブジェクトはプロパティの追加または変更を許可していません」というエラーが表示されます。デバッグウィンドウでは、オブジェクト番号が表示されますが、プロパティがなく.getText
、未定義として返されます。
これらは両方とも、スプレッドシートのカスタムメニュー項目によって呼び出されるProcessVotes関数によって起動されます。
function ProcessVotes() {
BuildUI();
NextIdea();
}
これはGASを作成する最初の試みですが、何が欠けているのかわかりません。関数の最後で使用している例はたくさんありreturn app;
ますが、スクリプトがサービスとして公開されている場合にのみ使用されるという印象を受けています。スプレッドシート内でこれを使用しようとしています(onOpen
の代わりに使用するonGet
など)