スプレッドシート ワークシートの行のサブセットを表示する 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 サービスにアクセスせずに、他にどのようにこれを実装できますか?