0

Google スプレッドシートのリーダー ボード (Google チャート) を表示する GAS があります。

スプレッドシートが更新されるたびにグラフが更新され、最新のスコアが表示されるようにしたいと考えています。

新しいスコアがあるたびに、スプレッドシートは新しいスコアを計算し、リストを更新します。(この部分は既に GAS を使用して正常に動作しています)

うまくいかないように見えるのは、webApp がチャートをリロード/再描画しないことです。

このlogChange()関数はonChange()、スプレッドシートが変更されたときに起動するスプレッドシート トリガーによって呼び出され、そのプロセスの開始と終了を正常に記録します (redrawUI()関数の呼び出しに成功)。

webApp コードを以下に示します。スプレッドシートに変更があるたびに、このアプリでグラフを再描画するのを手伝ってくれる人はいますか?

function doGet(e) {
  var app = drawUI();
  return app;
}

function logChange(e) {
  Logger.log("Changed at: " + new Date());
  redrawUI();
  Logger.log("after redrawUI recall " + new Date());
  return app;
}

function redrawUI() {
  var app = drawUI();
  return app;
}

function drawChart() {
  var ss = SpreadsheetApp.openById('txS....w'); //Spreadsheet Key
  var hs = ss.getSheetByName('All Scores');
  var data = hs.getRange(1, 1, 11, 3);

  var barChart = Charts.newBarChart()
  .setDataViewDefinition(Charts.newDataViewDefinition().setColumns([1,2]))
  .setDataTable(data)
  .setOption('axisTitlesPosition', 'in')
  .setOption('hAxis.minorGridlines.count', 9)
  .setOption('theme', 'maximized')
  .setOption('colors', ['#45818e'])
  .setLegendPosition(Charts.Position.NONE)
  .setYAxisTextStyle(Charts.newTextStyle().setFontName('Courier New').setFontSize(48))
  .setDimensions(1000, 800)
  .build();

  return barChart;
}

function drawUI() {
  var barChart = drawChart();

  var app = UiApp.createApplication();
  var mainPanel = app.createHorizontalPanel();
  var hsLabel = app.createLabel("THE Geek Game 2013")
                   .setStyleAttribute("font-size", "5em")
                   .setStyleAttribute("font-weight", "bold")
                   .setStyleAttribute("line-height", "2em");
  var subLabel = app.createLabel("Leader Board")
                   .setStyleAttribute("font-size", "3em")
                   .setStyleAttribute("font-weight", "bold")
  var vPanel = app.createVerticalPanel().setId("vPanel");

  mainPanel.add(vPanel).setSize("100%", "100%")
    .setCellHorizontalAlignment(vPanel, (UiApp.HorizontalAlignment.CENTER));
  vPanel.add(hsLabel).add(subLabel);
  vPanel.add(barChart).setSize("500", "100%");
  vPanel.setCellHorizontalAlignment(hsLabel, (UiApp.HorizontalAlignment.CENTER));
  vPanel.setCellHorizontalAlignment(subLabel, (UiApp.HorizontalAlignment.CENTER));

  app.add(mainPanel);
  app.createServerHandler("redrawUI");  
  return app;
}

現在のアプリがどのように表示されるかを確認するには、次のリンクを参照してください: https://script.google.com/macros/s/AKfycbykZZYCXd9SCJL0pnoNrR7L5ekdFQb8CzRsut0vLunKwq4jg8o/exec

4

1 に答える 1

0

私の知る限り、webapp 自体で「timer*」を使用する以外に、ユーザーの操作なしで webApp Ui を更新する方法はありません。

私がお勧めするのは、スプレッドシートのバインドされたスクリプトの onChange トリガーで userProperties に「フラグ値」を設定し、タイマー* を使用してその値をポーリングし、変更に気付いたときに更新することです。クォータの制限を回避するために、1 日の特定の時間帯に更新を制限することができます。

*注 :このようなタイマーの例については、checkBoxをハンドラー トリガーとして使用するこの投稿を参照してください。

于 2013-11-09T00:18:30.037 に答える