2

他のスプレッドシートから取得したデータを使用してスプレッドシートを作成するためのスクリプトを呼び出すインターフェイスがあります。ユーザーに視覚的なフィードバックを提供し、スクリプトが実行されていてスタックしていないことを知らせるために、実行時にインターフェイスのラベルを更新する必要があります。インターフェイスに配置したラベルを更新しようとすると、最初は更新されませんが、myFunction() が最後に到達した後に正しく更新されます。つまり、「作成が完了しました」というメッセージは表示されますが、「ファイルを作成しています...」というメッセージは表示されません。また、ボタン buttonCompile が無効になることはないため、 myFunction() の前の命令はまったく実行されないようです。myFunction() の実行が開始される前に、ラベルを更新してボタンを無効にするにはどうすればよいですか? (すでに変数参照を再確認しました)

function doGet() {
  var app = UiApp.createApplication();
  app.add(app.loadComponent("File creation"));
  var buttonCreate = app.getElementById('createBtn');
  var handlerCrea = app.createServerHandler('createClickHandler');
  buttonCreate.addClickHandler(handlerCreate);
  return app;
}

function createClickHandler(e) {
  var app = UiApp.getActiveApplication();
  var label = app.getElementById('createLbl');
  label.setText("Creating file...");
  var buttonCompile = app.getElementById('compileBtn');
  buttonCompile.setEnabled(false);
  myFunction();
  label.setText("Creation completed.");
  buttonCompile.setEnabled(true);
  app.close();
  return app;
}
4

1 に答える 1

1

この動作の原因は、ハンドラーを離れた後にのみ GUI が更新されることです。回避策は、2 つのハンドラーを使用することです。最初のものはラベルテキストを設定しCreating file...てボタンを無効にし、2番目のものはmyFunction機能を実行し、テキストを変更しCreation completed,てボタンを有効にします。ここに例があります。ボタンを無効/有効にすると、ワーカー ハンドラーは 5 秒間待機します。

function doGet(e) {
  var app = UiApp.createApplication();
  var container = app.createHorizontalPanel().setId('container');
  var btnPerformance = app.createButton("Performance Demo").setId('btnPerformance');
  var handlerPerformance = app.createServerHandler('onBtnPerformanceClick');
  var handlerWait = app.createServerHandler('onWait');
  btnPerformance.addClickHandler(handlerPerformance);
  btnPerformance.addClickHandler(handlerWait);
  container.add(btnPerformance);
  app.add(container);
  return app;
}

function enableControls(enable) {
  var lstControls = [ 'btnPerformance' ];
  var app = UiApp.getActiveApplication();
  for (var i = 0; i < lstControls.length; i++) {
    var ctl = app.getElementById(lstControls[i]);
    ctl.setEnabled(enable);
  }
}

function onWait(e) {
  enableControls(false);
  return UiApp.getActiveApplication();
}

function onBtnPerformanceClick(e) {
  Utilities.sleep(5000);
  enableControls(true);
  return UiApp.getActiveApplication();
}
于 2012-10-08T09:20:18.030 に答える