2

初めてGASにUIWebアプリをデプロイします。デプロイされたスクリプトURLを表示しようとした後、「nullのメソッド「getSheets」を呼び出せません」TypeErrorを取得します。

https://script.google.com/macros/s/AKfycbzuQNbkTeBpRPz75Q4dRiVLfEYtuLiuBKnWeA5CbD0/dev

スプレッドシートは次のとおりです。

https://docs.google.com/spreadsheet/ccc?key=0AnJTymuE8awLdHZ6QzhNVXpjeFphM3pMV1cxU0daZ2c

スクリプトコード:

// https://developers.google.com/apps-script/class_listbox - How to create listBox
function doGet() {
   //var ss = SpreadsheetApp.openById("0AnJTymuE8awLdHZ6QzhNVXpjeFphM3pMV1cxU0daZ2c");
   var ss = SpreadsheetApp.getActiveSpreadsheet();
   var sheet = ss.getSheets()[1];  
   var app = UiApp.createApplication().setTitle('App to show how ListBox data can update');
   var panel = app.createVerticalPanel();
   var lb = app.createListBox(true).setId('myLBid').setName('myLBname');

   // how many items to show
   lb.setVisibleItemCount(10);

   // get sorted names
   var rows = sheet.getDataRange();
   var numRows = rows.getNumRows();
   var values = rows.getValues();

   for (var i = 0; i <= numRows - 1; i++) {
     var row = values[i];
     lb.addItem(row);
   }

   panel.add(lb);
   var button = app.createButton('Submit');
   var handler = app.createServerClickHandler('respondToSubmit').addCallbackElement(panel);
   button.addClickHandler(handler);
   panel.add(button);
   app.add(panel);
   ss.show(app);
 }

// http://youtu.be/5VmEPo6Rkq4 - How to have sumbit write data to ss
function respondToSubmit(e) {
   var app = SpreadsheetApp.getActiveSpreadsheet();
   //reference widget name to capture what user selected
   var listBoxValue = e.parameter.myLBname;
   var ss = SpreadsheetApp.getActiveSpreadsheet();
   var sheet = ss.getSheets()[2];
   var lastRow = sheet.getLastRow()+1;
   var lastCell = sheet.getRange("A"+lastRow);
   lastCell.setValue(listBoxValue);
   return app.close();
}

/**
 * Adds a custom menu to the active spreadsheet, containing a single menu item
 * for invoking the readRows() function specified above.
 * The onOpen() function, when defined, is automatically invoked whenever the
 * spreadsheet is opened.
 * For more information on using the Spreadsheet API, see
 * https://developers.google.com/apps-script/service_spreadsheet
 */
function onOpen() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var entries = [{
    name : "Names",
    functionName : "doGet"
  }];
  sheet.addMenu("Script Menu", entries);
};

エディターから実行すると完璧に動作します。

Webアプリが機能するためにコードで何を変更する必要があるかを知りたいです。ss内で実行したときと同じように、UIがスクリプトURLに表示されることを期待しています。それは何が起こるべきではありませんか?

4

1 に答える 1

3

編集: おっと、申し訳ありませんが、他のエラーに気づきませんでした。webApps とスプレッドシート UI の違いに関するドキュメントを見て、その後私の回答を読んでください。

なぜこの行にコメントしたのですか?

SpreadsheetApp.openById("0AnJTymuE8awLdHZ6QzhNVXpjeFphM3pMV1cxU0daZ2c");

Web アプリケーションとして実行している場合は、アクティブなスプレッドシートがないため、常に ID でスプレッドシートを開く必要があります (スプレッドシートからのビューでは、ユーザーはスプレッドシートを開いておらず、スクリプトのみが開いています...)

また、 「UI がスクリプト URL に表示されることを期待しています」とは、正確にはどういう意味ですか?

Ui は、デプロイ時に作成される URL に移動すると、スタンドアロン アプリとして表示されます (そのバージョンも保存する必要がありますが、それを実行するときに非常によく説明されています)。

于 2012-06-29T20:07:29.070 に答える