0

背景:私はGoogleサイトを持っており、生徒のマークを含むGoogleスプレッドシートから情報を取得していますが、生徒が現在のすべてのマークのレポートをいつでもリクエストできるように、より動的にしたいと考えています。 dが好きです。私が書いたスクリプトでは、生徒はパスワードを入力し、ボタンをクリックすると、マークが生成されます。

問題:私が読んだところによると、ボタンをクリックすると、ボタンのハンドラーによってスクリプトが再実行されます。現在のスプレッドシートを保存できません。スプレッドシートにアクセスしようとすると、nullであると表示されます。スプレッドシートに再度アクセスするにはどうすればよいですか?ScriptPropertiesを使用してみましたが、同じ結果が得られました。ちなみに、Webアプリとして実行しないと動作します。

これがdoGet()関数と、UIのボタンが押されたときに呼び出されるgetPassword()関数の一部です。

function doGet() {
  var app = UiApp.createApplication();
  app.add(app.loadComponent("MyGui"));

  var panel = app.getElementById("VerticalPanel1");
  var text = app.createPasswordTextBox().setName("text");
  var handler = app.createServerHandler("getResults").addCallbackElement(text);

  panel.add(text);
  panel.add(app.createButton("Get Record", handler));

  SpreadsheetApp.getActiveSpreadsheet().show(app);
}

function getResults(eventInfo) {
  var app = UiApp.createApplication();
  var password = eventInfo.parameter.text;

  var panel = app.getElementById("VerticalPanel1");
  var textArea = app.createRichTextArea();
  panel.add(textArea);

  var pointsSheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var passwordCheckRange = pointsSheet.getRange("B70:C94").getValues();
  ...
4

1 に答える 1

1

問題はおそらく、スクリプトをWebアプリとして実行すると、「activeSpreadSheet」がないため、SpreadsheetApp.getActiveSpreadsheet()。getActiveSheet();である可能性があります。失敗します。別のアプローチは、隠しフィールドのスプレッドシートIDをコールバックに渡すことです。

doGet関数で:

var hidden = app.createHidden('ssId', 'YOUR_SS_ID_HERE');
panel.add(hidden);
var handler = app.createServerHandler("getResults").addCallbackElement(text);
handler.addCallbackElement(hidden)`

コールバック関数で

var ssID = eventInfo.parameter.ssId;
var pointsSheet = SpreadsheetApp.openById(ssID).getSheetByName('SHEET_NAME');
于 2013-09-20T23:44:13.840 に答える