質問するログイン新規登録
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

解決済

2回答

1832閲覧

GAS 特定のセルと一致する場合のみ表示にする

riko_sceed

総合スコア1

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

0グッド

0クリップ

投稿2022/12/29 12:13

編集2022/12/30 07:04

0

0

前提

A3のセルとB列が一致する数字の場合のみ表示し一致しない行は非表示にするものを作成したいです。
A3はプルダウンで1~31まで変動します。
ご回答お願いいたします。
イメージ説明
イメージ説明

実現したいこと

ここに実現したいことを箇条書きで書いてください。
例)A3 4

B3~B5 5
B5~B8 4
B9~B12 3
であればB5~B8以外をすべて非表示にしたい。
(B5~B8は表示したまま)

発生している問題・エラーメッセージ

一致している、していない関係なくすべての行が非表示になってしまう
上の例でいうとB3~B12まで全て非表示になる

該当のソースコード

function hideRow() { //スプレッドシートを取得する var ss = SpreadsheetApp.getActiveSpreadsheet(); var sh = ss.getActiveSheet(); //シート最終行の値を取得する const lastRow = sh.getLastRow(); //指定したセル範囲を取得する const range = sh.getRange("B6:B1500");   var a3 = sh.getRange('A3').getValue();  for(var i =0; i< range; i++) { //B列がA3と一致するか判断する if(a3 == range){ console.log("成功したよ"); } else{ //一致しない場合は非表示にする sh.hideRow(range); console.log("のののー"); } } }

試したこと

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Cocode

2022/12/30 06:35

質問のタイトル『GAS 特定のセルと一致する場合非表示にする』ではなく、 『GAS 特定のセルと一致する場合表示する』 または『GAS 特定のセルと一致しない場合非表示にする』ではないでしょうか? 何度も本文とタイトルを見直して、どっちだろう…と理解するのに苦労しました><!!
guest

回答2

0

ベストアンサー

仕様

  • 図形でボタンを設置して、そのボタンでフィルターを実行する仕様にしました。
    • ドロップダウンリストを選択するだけでフィルター実行することもできますが、全体的に重くなりますのでおすすめしません。
  • 同様に、図形ボタンにてフィルターを解除できるようにしました。
  • 行数が多いと動作に時間がかかるとのことで、なるべく軽くなるようにしました。

GASの処理を軽く(速く)する方法

処理を軽く(速く)する方法は、GASとスプレッドシートの通信回数を減らすことです。

  • 例えば、全部で1500行、そのうち対象の行が100行ある場合、
    • 1行ずつ処理していると、判定で1500回 + 表示・非表示でさらに1500回通信(合計3000回)することになります。
    • 一括判定ですと、判定で1回 + 非表示1回 + 表示で100回(合計102回)の通信で済みます。

私のコードは後者の処理方法をしています。

コード例

イメージ説明
イメージ説明

javascript

1// (例では、青い図形ボタンを押したら実行) 2function filterRows() { 3 const ss = SpreadsheetApp.getActiveSpreadsheet(); 4 const sheet = ss.getActiveSheet(); 5 const startRow = 6; 6 const lastRow = sheet.getLastRow(); 7 8 // A3セルの値を取得 9 const criterion = sheet.getRange('A3').getValue(); 10 11 // B6〜最終行までのB列の値を取得 12 const values = sheet.getRange(startRow, 2, lastRow - startRow + 1, 1).getValues().flat(); 13 // 例:[ 1, 2, 3, 4, 5, 4, 2, '', 1, 1, 3, '', 2, 1, 5, 5, 3 ] 14 15 // A3セルの値=B列の値である、行番号を取得 16 const targetRows = values.flatMap((v, i) => v === criterion ? i + startRow : []); 17 // 例:[ 10, 20, 21 ] 18 19 // 6行目以降の、全ての行を非表示 20 sheet.hideRows(6, lastRow - startRow + 1); 21 22 // 該当行のみ表示 23 for (const rowNum of targetRows) { 24 sheet.showRows(rowNum); 25 } 26} 27 28// (例では、赤い図形ボタンを押したら実行) 29function showAllRows() { 30 const ss = SpreadsheetApp.getActiveSpreadsheet(); 31 const sheet = ss.getActiveSheet(); 32 sheet.unhideRow(sheet.getDataRange()); 33}

投稿2022/12/30 04:57

編集2022/12/30 05:04
Cocode

総合スコア2316

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

riko_sceed

2022/12/30 07:06

ありがとうございます!実行速度はこちらでベストなのですがA3と一致するものまですべて非表示になってしまいました、、 質問更新しシートの画像も貼ってみたのですが私の誤りがございますでしょうか?
Cocode

2022/12/30 07:22 編集

画像を拝見しました! ・列や行番号が表示されておりませんので、本当にプルダウンがA3セルに存在しているか私にはわからない。 ・同上の理由で日付がB列なのかわからない。 ・日付が1しかみえないので、11が存在しているかわからない。 ・コードが提示されていないので本当にコピペしただけなのか、どこか編集してそれが間違っているのわからない。 などなどで、結論、わかりません!すみません><!
Cocode

2022/12/30 07:23

私の環境ではうまく動いているので、何かが間違っているのだと思います。
Cocode

2022/12/30 07:28

あとはちょっと試していただきたいのが、全部で50行くらいに減らしたらうまくいくのか?です。 もしかしたら実行時間の上限になってしまっているのかもしれません。
riko_sceed

2022/12/30 07:48

ありがとうございます!表示形式を統一したら無事実行できました 助かりました。本当にありがとうございます。
Cocode

2022/12/30 07:54

よかったですー!
guest

0

これでどうでしょうか。

js

1function hideRow() { 2 // スプレッドシートを取得する 3 const ss = SpreadsheetApp.getActiveSpreadsheet(); 4 const sheet = ss.getActiveSheet(); 5 6 // 指定したセルを取得する 7 const a3 = sheet.getRange('A3').getValue(); 8 9 // 参照するセル範囲を取得する 10 const firstRow = 6; 11 const lastRow = sheet.getLastRow(); 12 13 console.log({a3}); 14 for (let i = firstRow; i <= lastRow; ++i) { 15 const range = sheet.getRange(`B${i}`); 16 const value = range.getValue(); 17 if (value === a3) { 18 sheet.unhideRow(range); 19 } 20 else { 21 sheet.hideRow(range); 22 } 23 } 24}

投稿2022/12/29 13:29

arcxor

総合スコア2857

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

riko_sceed

2022/12/29 13:58

ありがとうございます。A3と一致するもの以外非表示にできました!! 行数が多くなってきたら(1500行までぐらいを想定しています。)重たくなってくるかもしれないので、なにか改善方法などアドバイスございますか?
arcxor

2022/12/30 00:45

> A3のセルとB列が一致する数字の場合のみ表示し一致しない行は非表示にするものを作成したいです。 なぜこんなことをしたいのでしょうか。目的が分からなければアドバイスできません。 通常はこんなことをせず、見出し行を選んで、メニューから「データ > フィルタを作成」をクリックします。出てきたフィルタメニュー(B5セルの右側)をクリックして、表示したい値だけを選んでフィルタを実行します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問