0

GUIを更新する別の方法はありreturn app;ますか?

ダウンロードを開始するなど、URL フェッチを行う前にラベルにテキストを設定し、完了後にラベルをダウンロード完了に変更したいと考えています。

function EventHandler(e) {
  var app = UiApp.getActiveApplication();
  var url = e.parameter.URLInput;
  var label = app.getElementById("label");
  label.setText("Download started");
  try{
    var file = UrlFetchApp.fetch(url).getBlob();
   } catch(err){
    label.setText(err);
  }
  label.setText("Download finished");
  return app;
}

ラベルは が完了するまで空のままUrlFetchAppで、ラベルの内容は「ダウンロードが完了しました」になります。return app;フェッチの前に追加すると、関数が終了します。

4

1 に答える 1

1

doGet 関数で、 clientHandlerを使用してText をラベルに設定する必要があります。ボタンをクリックするとすぐに clientHandler が実行されます。

これがどのように機能するかを示すテストアプリです: (シミュレートされたダウンロードでオンラインテストが利用可能です)

function doGet(){
  var app = UiApp.createApplication();
  var label = app.createLabel('---empty---').setId('label');
  app.add(label)
  var handler = app.createServerHandler('EventHandler');
  var cHandler = app.createClientHandler().forTargets(label).setText('starting download');
  var btn = app.createButton('start',handler).addClickHandler(cHandler);
  app.add(btn);
  return app;
}



function EventHandler(e) {
  var app = UiApp.getActiveApplication();
  var url = e.parameter.URLInput;
  var ulabel = app.getElementById("label");
  ulabel.setText("Download started");
  try{
    //var file = UrlFetchApp.fetch(url).getBlob();
  } catch(err){
    label.setText(err);
  }
  ulabel.setText("Download finished");
  return app;
}

注: 同じクライアント ハンドラーを使用して、他の多くの便利なことを行うことができます: ボタンを無効にしたり、スピナーを表示したり... doGet 関数で遅滞なく発生する必要があります。


コメントに従って編集

2 つのサーバー ハンドラを並行して使用してみましたか? displayHandler では、必要な条件を設定できます。次の例では単純なままにしています。

function doGet(){
  var app = UiApp.createApplication();
  var label = app.createLabel('---empty---').setId('label');
  app.add(label)
  var handler = app.createServerHandler('EventHandler');
  var displayHandler = app.createServerHandler('displayHandler');
  var btn = app.createButton('start',handler).addClickHandler(displayHandler);
 // you can add other handlers (keypress, hover... whatever) they will all execute at the same time
  app.add(btn);
  return app;
}

function displayHandler(e) {
  var app = UiApp.getActiveApplication();
  var ulabel = app.getElementById("label");
  ulabel.setText("Download started");
  return app;
}

function EventHandler(e) {
  var app = UiApp.getActiveApplication();
  var url = e.parameter.URLInput;
  var ulabel = app.getElementById("label");
  try{
    Utilities.sleep(2000);// simulating download
  } catch(err){
    label.setText(err);
  }
  ulabel.setText("Download finished");
  return app;
}
于 2013-10-03T22:16:25.920 に答える