2

スプレッドシート用にGoogleアプリでスクリプトを作成しています。これにより、列Hにアスタリスク(*)が含まれる行を非表示にできます。スプレッドシートは現在 700 行以上あります。スクリプトを実行すると、完了するまでに約 90 秒かかり、結果を確認できます。誰もデータに時間を割いていないので、より効率的にしようとしています。

これは、つなぎ合わせたコードがどのように見えるかであり、より高速に書き直す方法についての手がかりがありません。ここでインスピレーションを得ました。セルの最初の文字に基づいて Google スプレッドシートの行を非表示にする

/**
 * Hides rows where H = Astrisk, Unhides where H != Astrisk
 */
function updateProgram() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("Week 1-4");
  var data = sheet.getRange('H:H').getValues();

//iterate over all rows
  for(var i=0; i< data.length; i++){
    //compare first character, if asterisk, then hide row
    if(data[i][0].charAt(0) == '*'){
      sheet.hideRows(i+1);
    } else sheet.showRows(i+1);
  }
}

現在、すべての行を実行し、単一の条件で関数を実行し、すべての行で関数を実行しています。可能な解決策としてこれについて考えました。

  • H = * || の場合 行が表示されている
  • H != * || の場合 行が非表示の場合に表示
  • そうでなければ何もしない

したがって、非表示/表示が必要な行のみが取得されます。

時間を割いて読んでいただきありがとうございます。お役に立てれば幸いです。

アップデート;

行をグループ化して、値に応じて多数の行を表示および非表示にする方法を見つけました。コードは次のようになり、実行に 10 秒かかります。

これは私の最初の自己記述コードの一部なので、フィードバックは大歓迎です!

function updateProgramWeek1to4() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = ss.getSheetByName("Week 1-4");
var row = s.getRange('G:G').getValues();
var maxRows = s.getMaxRows();

s.showRows(1, maxRows);

for(var i=0; i< row.length; i++){
   if(row[i] == '0'){
     s.hideRows(i+1, 11);
   } 
     else if(row[i] == '1'){
     s.hideRows(i+3, 9);
   } 
     else if(row[i] == '2'){
     s.hideRows(i+4, 8);   
   } 
     else if(row[i] == '3'){
     s.hideRows(i+5, 7);
   } 
     else if(row[i] == '4'){
     s.hideRows(i+6, 6);   
   } 
     else if(row[i] == '5'){
     s.hideRows(i+7, 5);
   } 
     else if(row[i] == '6'){
     s.hideRows(i+8, 4);
   } 
     else if(row[i] == '7'){
     s.hideRows(i+9, 3);
   } 
     else if(row[i] == '8'){
     s.hideRows(i+10, 2);
   } 
     else if(row[i] == '9'){
     s.hideRows(i+11, 1);
   } 
     else if(row[i] == '10'){
     s.hideRows(i+12);  
   }
     else if(row[i] == '11'){
     s.hideRows(i+1);  
   }
  }
 }
4

2 に答える 2

2

このスクリプトの修正版を作成しました。

HEREはデモ スプレッドシートです。独自のコピーを作成します。一度に最大 500 行を非表示にします。アイデアは、最小限の紙幣を使用して現金を支払うことに似ています。このスクリプトは、シートの列から 1、5、10、50、100、および 500 の数字を読み取り、その数の行を一度に非表示にします。連続する行の各ブロックは個別に計算されます。つまり、中間の行を表示したい場合、その前後の非表示の行は同じように高速に処理されます。いくつかの表示された行、次に 63 の非表示の行、次にいくつかの表示された行、そして 756 の非表示の行があるとします。63 行は、50+10+1+1+1 として 5 つのステップで処理されます。756 行は 500+100+100+50+5+1 として 6 ステップで処理されます。

上記の user2845885 は、コードの初期バージョンを作成および共有した功績を認められています。ここに私の修正版があります:

function hideRows() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = ss.getSheetByName("Demo sheet"); // Enter sheet name
var row = s.getRange('B:B').getValues(); // Enter column letter that has the numbers 500, 100, 50, 10, 5, 1

s.showRows(1, s.getMaxRows());

for(var i=0; i< row.length; i++){ 
if(row[i] == '500') { s.hideRows(i+1, 500); }
else if(row[i] == '100'){ s.hideRows(i+1, 100); }
else if(row[i] == '50'){ s.hideRows(i+1, 50); }
else if(row[i] == '10'){ s.hideRows(i+1, 10); }
else if(row[i] == '5'){ s.hideRows(i+1, 5); }
else if(row[i] == '1'){ s.hideRows(i+1, 1); } } }

コーディングについてはよくわかりませんが、数式はかなり得意です。しかし、驚くべきことに、数値列の数式を書くことは、スクリプトよりもはるかに困難でした。ここで注意が必要です。数値列の次の数値が 10 であるとします。これは、スクリプトが一度に 10 行を非表示にすることを意味します。これは、10 行の次の 9 行に、スクリプトが探している数字が含まれていない場合にのみ機能します。したがって、式は非常にトリッキーでした。数値列を作成する方法は次のとおりです。 A2 から始まる列 A を想定すると、非表示にする行に「非表示」と表示され、表示される行は空白になります。次の数式をセル B2 に入力し、下にコピーします。

=IF(OR(A2="",
SUM($B1:INDEX(B$1:B1,IF(row()-499<1,1,row()-499)))>=500,
SUM($B1:INDEX(B$1:B1,IF(row()-99<1,1,row()-99)))>=100,
SUM($B1:INDEX(B$1:B1,IF(row()-49<1,1,row()-49)))>=50,
SUM($B1:INDEX(B$1:B1,IF(row()-9<1,1,row()-9)))>=10,
SUM($B1:INDEX(B$1:B1,IF(row()-4<1,1,row()-4)))>=5),
"",
IF(ArrayFormula(MATCH(FALSE,A2:A=A2,0)-1)>=500,500,
IF(ArrayFormula(MATCH(FALSE,A2:A=A2,0)-1)>=100,100,
IF(ArrayFormula(MATCH(FALSE,A2:A=A2,0)-1)>=50,50,
IF(ArrayFormula(MATCH(FALSE,A2:A=A2,0)-1)>=10,10,
IF(ArrayFormula(MATCH(FALSE,A2:A=A2,0)-1)>=5,5,
IF(ArrayFormula(MATCH(FALSE,A2:A=A2,0)-1)<5,1)))))))
于 2016-02-22T23:38:22.860 に答える
2

sheet.hideRows/showRows で処理する数を指定する 2 番目のパラメータを使用すると、はるかに高速化できます。ループを変更し、同じ状態の行がいくつあるかを覚えておく必要があります。状態が変化すると、一括で表示/非表示を切り替えます。

于 2013-10-04T13:17:03.410 に答える