2

ポケモンのコレクションに関するデータを保存するためのスプレッドシートテンプレートがあります。人々がポケモンをアルファベット順および数値順に並べ替える2つの主要な方法があり、私は他の人のスプレッドシートとの簡単な比較のために両方に対応したいと思います。私はまた、人々がポケモンを現在収集していないものを簡単に隠すことを許可したい。問題は、スプレッドシートのサイズとシート数です。さらに複雑な問題は、要約チェックリストのページで、データのために他のページのほとんどを参照しています。さらに問題を複雑にするのは、データを7つのセクションに分割するには、数値で並べ替えるときにヘッダー行で区切りますが、アルファベット順で並べ替えるときにはヘッダー行を非表示にしたいということです。私は試しました:Googleシート - 複数のシートを同時にソートしてフィルタリングする

1)スクリプトを使用して各シートを繰り返し、2列目に「FT」(取引用)とマークされていないすべての項目を非表示にします(列1は簡単な参照ページ用の隠れたインデックスです)。シートが非常に大きく、各行を1つずつ隠すと、実行が完了するまでにスクリプトがタイムアウトするまでに時間がかかります。一度にすべてを非表示にして、一度に1つの行を表示すると同じ問題が発生します。

2)ビューのみのユーザーが余裕でオンとオフを切り替えることができるようにフィルタビューを使用します。これは、ユーザーが各ページを個別に切り替える必要があるためですが、チェックリストページでフィルタを使用しても、他のページのセルを参照するためにフィルタが破損しても必ずフィルタの外側にあるためです。スクリプトを使用してフィルタを使用していますが、チェックリストと、必然的に参照する必要のある無数のページとの間のセル間の相関を破ることなく、その方法をわかりません。私は、スクリプトを介してVIEWフィルタを使用する方法を検討しましたが、悲しいかな、APIはそれをまだサポートしていません。

以下は、公開編集権限を持つスプレッドシートのコピーへのリンクです。

https://docs.google.com/spreadsheets/d/1NpsabimIJ4T_ZoeSxaq_dk6ZkIoHey2Dl6U3LGpVTc4/edit?usp=sharing

「FT」タイムアウトや私の数式を壊さないとマークされていない行を非表示にする良い方法があります:必要があるかもしれ閲覧そう説明するがたくさんありますか?私がすでに試したスクリプトはあまりにも長くかかりました。彼らはそれぞれ、それらの効果を逆に双子を持っています。

function browseMode() { 
    var spreadsheet = SpreadsheetApp.getActive(); 
    var sheets = spreadsheet.getSheets(); 

    var sheet = sheets[2]; 
    var range = sheet.getRange("B3:B392"); 
    var data = range.getValues(); 
    sheet.hideRow(range); 
    for (var i = 0; i < 390; i++) { 
    if (data[i][0] == "FT") sheet.showRows(i+3); 
    } 
    for (var i = 3; i <= 26; i++) { 
    sheet = sheets[i]; 
    range = sheet.getRange("B5:B76"); 
    data = range.getValues(); 
    sheet.hideRow(range); 
    for (var j = 0; j < 72; j++) { 
     if (data[j][0] == "FT") sheet.showRows(j+5); 
    } 
    range = sheet.getRange("B78:B128"); 
    data = range.getValues(); 
    sheet.hideRow(range); 
    for (var j = 0; j < 51; j++) { 
     if (data[j][0] == "FT") sheet.showRows(j+78); 
    } 
    range = sheet.getRange("B130:B192"); 
    data = range.getValues(); 
    sheet.hideRow(range); 
    for (var j = 0; j < 63; j++) { 
     if (data[j][0] == "FT") sheet.showRows(j+130); 
    } 
    range = sheet.getRange("B194:B226"); 
    data = range.getValues(); 
    sheet.hideRow(range); 
    for (var j = 0; j < 33; j++) { 
     if (data[j][0] == "FT") sheet.showRows(j+194); 
    } 
    range = sheet.getRange("B228:B300"); 
    data = range.getValues(); 
    sheet.hideRow(range); 
    for (var j = 0; j < 73; j++) { 
     if (data[j][0] == "FT") sheet.showRows(j+228); 
    } 
    range = sheet.getRange("B302:B339"); 
    data = range.getValues(); 
    sheet.hideRow(range); 
    for (var j = 0; j < 38; j++) { 
     if (data[j][0] == "FT") sheet.showRows(j+302); 
    } 
    range = sheet.getRange("B341:B380"); 
    data = range.getValues(); 
    sheet.hideRow(range); 
    for (var j = 0; j < 40; j++) { 
     if (data[j][0] == "FT") sheet.showRows(j+341); 
    } 
    } 
    sheet = sheets[27] 
    range = sheet.getRange("B3:B104"); 
    data = range.getValues(); 
    sheet.hideRow(range) 
    for (var i = 0; i < 102; i++) { 
    if (data[i][0] == "FT") sheet.showRows(i+3); 
    } 
} 

function sortAlphabetically() { 
    var spreadsheet = SpreadsheetApp.getActive(); 
    var sheets = spreadsheet.getSheets(); 

    var sheet = sheets[1]; 
    sheet.hideRows(4); 
    sheet.hideRows(77); 
    sheet.hideRows(129); 
    sheet.hideRows(193); 
    sheet.hideRows(227); 
    sheet.hideRows(301); 
    sheet.hideRows(340); 
    sheet.getRange("A4:AB380").sort(2); 

    sheets[2].getRange("A3:AG392").sort(3); 

    for (var i = 3; i <= 26; i++) { 
    sheet = sheets[i]; 
    sheet.hideRows(4); 
    sheet.hideRows(77); 
    sheet.hideRows(129); 
    sheet.hideRows(193); 
    sheet.hideRows(227); 
    sheet.hideRows(301); 
    sheet.hideRows(340); 
    sheet.getRange("A4:AB380").sort(3); 
    } 

    sheets[27].getRange("A4:AN104").sort(3); 
} 

は私がのためのフォーラムを検索けれども、私はここに新たなんだと、これを読んで、これは別の質問に似ている場合はご容赦くださいに時間を割いていただきありがとうございます似たような質問があり、何も見つかりませんでした。私は何を探すべきか、どのように見えるかは分かっていません。

答えて

0

まず、hideRows()のマップを作成します。このマップを使用すると、hideRows()が実行されます。これにより、時間とスクリプトのコストが低くなると思います。あなたの質問を誤解した場合、私は残念です。エラーが発生した場合は、教えてください。

また、どのように約sortAlphabetically()を使用しますか?

サンプルスクリプト:

function browseMode(){ 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheets = ss.getSheets(); 
    for (var s=3; s<sheets.length; s++) { 
    var sheet = ss.getSheets()[s]; 
    try { 
     var data = sheet.getRange(1, 2, sheet.getLastRow(), 1).getValues(); 
    } catch(e) {} // If there are no data in the sheet, do nothing. 
    var c1 = 0; 
    var hrow = []; 
    data.forEach(function(e, i){ // Here, create a map for hiding rows. 
     if (e[0]) { 
     hrow.push([(c1 + 1), (i - c1)]); 
     c1 = i + 1; 
     } 
    }); 
    [sheet.hideRows(i[0], i[1]) for each (i in hrow) if(i[1]>0)]; // Here, rows are hidden using the map. 
    } 
} 
+0

それは起こっていた正確に理解するために私に少し時間がかかったが、はい!これははるかに速く動作します。私は一度変更する必要がありました。それは隠れている必要がある行の最後のセットを残していました。ループの後に、hrow.push([(c1 + 1)、(data.length-c1)])を追加する必要がありました。 –

+0

スクリプトが動作するかどうか心配です。それがあなたに役立つなら、私はうれしいです。 – Tanaike

関連する問題