8

ドキュメントで作業しているときに、複数の列で何度も並べ替えたいスプレッドシートがあります。これはGUIを使用した複数のステップからなるプロセスであり、時間がかかりすぎるように思われました。ヘッダー行のチェックボックスをオンにし、最初の並べ替えパラメーターを設定してから、別のパラメーターを追加する必要があります。ふぅ!早く古くなります。

シートの並べ替えは問題ありませんでしたが、ヘッダー行も並べ替えられました。sort()関数のパラメーターとしてヘッダー行があることを指定する方法も、sort()によって自動的に通知されるヘッダー行をグローバルに定義する方法もありません。

その代わりに、ヘッダー行を保存し、最初の行を削除し、シートを並べ替え、一番上に新しい行を挿入し、ヘッダー行を再作成して、ヘッダー行をフォーマットしました。わお!書くのにそれほど時間はかからず、うまく機能しますが、非常に複雑です。

ユーザーの観点からは、ヘッダー行はポップアップする前に一時的に消えます。それほど悪くはありませんが、何かが起こっていることは明らかです。

それで、最後に私は私の質問に取り掛かります:私がソートしているときにヘッダー行の存在を認める能力を見落としていませんか?または、スクリプトにヘッダー行が存在するシートを並べ替えると、頼りになることなくヘッダー行も並べ替えられますか?

並べ替えプロセスにヘッダー行を含めないようにするために私のメソッドまたはそのようなメソッドが必要な場合、この機能の追加を検討できるようにGoogle Appsチームに通知できる場所はありますか?ヘッダー行の存在を指定することは、単純なチェックボックスを使用してGUIに存在するため、存在するか、スクリプト内で並べ替えるときに追加できることを願っています。

編集

私の元のコード(ドキュメント/コメントが削除されています):

sheet.deleteRow(1);

rows.sort([<1st col>, <2nd col>]);

sheet.insertRowsBefore(1, 1);
for (var j = 0; j <= (numCols - 1); j++) {
  sheet.getRange(1, (j + 1)).setValue(firstRow[j]);
}

sheet.getRange(1, 1, 1, numCols).setFontWeight("bold");
sheet.getRange(1, 1, 2, numCols).setBorder(true, true, true, true, true, true);

上記のコードの代わりに私が試したことは、Thomasの提案に感謝します。

sheet.setFrozenRows(1);
sheet.sort(<2nd col>);
sheet.sort(<1st col>);
sheet.setFrozenRows(0);

残念ながら、これは行ではなく列で並べ替えるだけです。sheet.sort();2つの呼び出しを最初のコードブロックの行に置き換えてrows.short();も機能しません。これを試してみると、最初の行が並べ替え前にフリーズされていても、ヘッダー行が他のデータと一緒に並べ替えられるという最初の問題がコメントで報告されました。

また、この下に別のコード行が追加されない限り、スプレッドシートの上部に永続的な「Working...」通知が表示されます。ただし、何の影響も及ぼさないようです。

いずれの場合もvar sheet = SpreadsheetApp.getActiveSheet();、、、var rows = sheet.getDataRange();およびfirstRowはヘッダー行データの配列です。

4

2 に答える 2

9

すべての場合において、var sheet = SpreadsheetApp.getActiveSheet();、var rows = sheet.getDataRange();であり、firstRowはヘッダー行データの配列です。

getDataRange()を使用するのではなく、並べ替える範囲を取得する(つまり、ヘッダー行を除外する)ことができます。

var sheet = SpreadsheetApp.getActiveSheet();
var rows = sheet.getRange(2, 1, sheet.getLastRow() - 1, sheet.getLastColumn());

この次の部分は、「二次的な」質問に対する単なる回答/観察です。

スクリプトが終了した後、最初の行はフリーズされていますが、ヘッダー行は他のすべての行と一緒に並べ替えられました。

これは、これらの「スプレッドシートツール」メソッドの一部が互いにうまく機能しないGASの少しの制限だと思います。この問題はあなたの問題と同じではありませんが、(一種の)関連していると思います。

SpreadsheetApp.flush();したがって、「フリーズヘッダー」の回避策を使用して、直後に挿入すると機能するかどうかを確認したいと思いますsheet.setFrozenRows(1);

于 2012-10-02T21:58:35.030 に答える
3

あなたはこれをしたい:

次に、このスクリプトを呼び出します。

function myFunction() {
  SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().sort(1);
}

そして、あなたは行き​​ます:)

よろしくお願いします。

トーマス・ヴァン・ラタム

于 2012-10-02T14:51:34.650 に答える