1

スプレッドシート ワークシートの行のサブセットを表示する Web アプリを作成しています。ユーザーの利便性のために、データはグリッドに表示され、スプレッドシートから選択された各行がグリッド内の行を形成します。各ユーザーに関連する行数は、時間の経過とともに増加します。

グリッドのヘッダーは一連のボタンであり、ユーザーはデータの並べ替え順序を制御できます。したがって、ユーザーが最初の列のヘッダーにあるボタンをクリックすると、グリッドにデータを入力する配列が最初の列で並べ替えられます。同じ列ボタンを 2 回クリックすると、並べ替え順序が逆になります。

スクリプト プロパティを使用して、選択した並べ替えフィールドと順序を、ボタンの押下に応答するハンドラーと、並べ替えによって呼び出される順序関数との間で伝達しました。

したがって、doGet() では次のようになります。

// Sort Field and Order
ScriptProperties.setProperties({"sortField": "date","sortOrder": "asc"});

そしてボタンハンドラーで:

function sortHandler(event) {
  var id = event.parameter.source;

  if (id === ScriptProperties.getProperty("sortField")) {
  ScriptProperties.setProperty("sortOrder", (ScriptProperties.getProperty("sortOrder") === "asc")?"desc":"asc");
  } else {
    ScriptProperties.setProperties({"sortField": id, "sortOrder": "asc"});
  }
  var app = UiApp.getActiveApplication();
  app.remove(app.getElementById("ScrollPanel"));
  createForm_(app);
  return app;
}

そして order 関数自体 (これは配列の sort メソッドによって呼び出されますarray.sort(order);: グリッドを定義するコード内):

function orderFunction(a, b) {
  var sortParameter = ScriptProperties.getProperties();
  var asc = sortParameter.sortOrder === "asc";

  switch(sortParameter.sortField) {
    case "date":
      var aDate = new Date(a.date);
      var bDate = new Date(b.date);

      return (asc)?(aDate - bDate):(bDate - aDate);

    case "serviceno":

      return (asc)?(a.serviceno-b.serviceno):(b.serviceno-a.serviceno);

    default: // lexical
      var aLex = String(a[sortParameter.sortField]).toLowerCase();
      var bLex = String(b[sortParameter.sortField]).toLowerCase();

      if (aLex < bLex) {
        return (asc)?-1:1;
      } else if (aLex > bLex) {
        return (asc)?1:-1;
      } else {
        return 0;
      }
  }
}

このデザインの軟膏のハエはGoogleです。配列が特定のサイズに達すると、Properties サービスが頻繁に呼び出されているというエラーで並べ替えが失敗します。このメッセージは、 を使用して 1 秒の遅延を挿入することを提案してUtilities.sleep()いますが、グリッドのレンダリングには既に長い時間がかかります。配列が 2 つの値の順序を決定するのに 1 秒かかる場合、どうなるでしょうか?

私は ScriptDB で再実装しようとしましたが、同じ問題を抱えています。ScriptDB サービスへの呼び出しが Google の好みに対して頻繁に行われます。

orderFunction が App Script サービスにアクセスせずに、他にどのようにこれを実装できますか?

4

3 に答える 3

1

If you are looking for temporary storage, I prefer CacheService to ScriptProperties. Use

CacheService.getPrivateCache().put and CacheService.getPrivateCache().get

于 2013-08-20T06:01:37.337 に答える
0

非表示のウィジェットを使用してdoGet、関数間で情報を渡すこともできhandlerます。これは、scriptProperties サービスを呼び出すよりもはるかに高速です (実行トランスクリプトを見て、時間がかかることを確認してください。驚くことでしょう)。

一方、本当にそれを使い続けたい場合は、たとえばsortHandler(event)関数内で、scriptProperties サービスへの呼び出しの数を (わずかに) 減らすこともできます。

function sortHandler(event) {
  var id = event.parameter.source;
  var sortField = ScriptProperties.getProperty("sortField");
  var sortOrder = ScriptProperties.getProperty("sortOrder");
  if (id === sortField) {
  ScriptProperties.setProperty("sortOrder", (sortOrder === "asc")?"desc":"asc");
  } else {
    ScriptProperties.setProperties({"sortField": id, "sortOrder": "asc"});
  }
  var app = UiApp.getActiveApplication();
  app.remove(app.getElementById("ScrollPanel"));
  createForm_(app);
  return app;
}
于 2013-08-20T06:53:18.387 に答える
0

...他にどのように実装できますか?

HTMLService を jQuery DataTable と組み合わせて使用​​すると、ボタンを押すロジックなどのスクリプトを作成することなく、想像できるすべての順序付けを実行し、さらに多くのことができます。ここに基本テーブルへのスプレッドシートの例がありますhttp://davethinkingaloud.blogspot.co.nz/2013/03/jsonp-and-google-apps-script.html

于 2013-08-20T23:27:32.480 に答える