質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.31%
Google Apps Script

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

Q&A

解決済

2回答

1159閲覧

GASで行を非表示にする(現在表示分から○行)

a802

総合スコア15

Google Apps Script

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

0グッド

1クリップ

投稿2023/10/01 06:26

編集2023/10/01 06:30

実現したいこと

Googleスプレッドシートにて、複数行の非表示を自動で行えるようにしたい。

前提

販売店のシフト表をスプレッドシートで作成しています。
C列~I列で(日)~(土)を表現しています。

10/1(日)10/2(月)10/3(火)10/4(水)10/5(木)
昼1○○さん○○さん○○さん○○さん○○さん
昼2○○さん○○さん○○さん○○さん○○さん
○○さん○○さん○○さん○○さん○○さん
10/8(日)10/9(月)10/10(火)10/11(水)10/12(木)
昼1○○さん○○さん○○さん○○さん○○さん
昼2○○さん○○さん○○さん○○さん○○さん
○○さん○○さん○○さん○○さん○○さん

こんなイメージです。

数か月分を一気に作成している(行が100以上ある)のですが、週に1度、過去分(上記の例で言うと、10/8(日)以降に1~4行目)を非表示にしており、この作業を自動化したいなと考えています。

発生している問題

既に過去分が複数行 非表示になっている場合、下記コードでは「“非表示分も含めて数えた”2行目から3行」という意図になってしまうようで、実際に非表示にしたい行が非表示になってくれません。

やはりisRowHiddenByUserなどを使って判定させる仕組みを入れないといけないのでしょうか。

「非表示分をスキップさせて数える」というようなことが出来れば、
常に「sheet.hideRows(2, 3)」と(引数を)固定しておけるのになぁ、と思っています。

該当のソースコード

gs

1function autoHideRows() { 2 // スプレッドシートの読み込み 3 const spreadsheet = SpreadsheetApp.getActiveSpreadsheet() 4 // シートの選択 5 const sheet = spreadsheet.getSheetByName('シフト') 6 7 8 // 1行目から4行を隠す 9 sheet.hideRows(1, 4) 10} 11

最後に

拙い文章ですが、よろしくお願いいたします。
追加で必要な情報があればご指摘ください。

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

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

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

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

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

guest

回答2

0

ベストアンサー

(2023/10/4追記)
ごめんなさい。日曜日以外の動作を気にするあまり、
日曜日当日に起動したときの動作がが一週間ずれていましたので、
修正しましたのでご確認ください。

JavaScript

1//今週より前の週までを非表示にする 2function myFunction() { 3 const column = 3;//判定する日付の列 4 const ss = SpreadsheetApp.getActive(); 5 const sheet = ss.getSheetByName('シート1'); 6 //日付の列のデータを取得 7 const values = sheet.getRange(1, column, sheet.getLastRow(), 1).getValues().flat(); 8 const ixDate = new Date();//今日の日付 9 ixDate.setHours(0, 0, 0, 0);//比較のため時刻をクリア 10 ixDate.setDate(ixDate.getDate() - ixDate.getDay());//今週の日曜 11 let row = 0;//日付の行番号を保存 12 for (let i = 0; i < values.length; i++) { 13 if (Object.prototype.toString.call(values[i]) == '[object Date]') { 14 const date = values[i]; 15 row = i + 1;//今週の行番号を代入 16 console.log(Utilities.formatDate(date, 'JST', 'yyyy/MM/dd')); 17 if (date >= ixDate) {//比較を簡便にするため>=としている 18 //今週(以降)の日付なら前の行までを非表示 19 if (row > 1) { 20 sheet.hideRows(1, row - 1);//前の行までを非表示 21 } 22 break; 23 } 24 } 25 } 26}

(当初の回答)
表示は日本語になっていますが、
日付がテキストでなくて日付として入力されているのであれば、
次のような方法が使えると思います。

JavaScript

1//今日より前の日付の前の行までを非表示にする 2function myFunction() { 3 const column = 3;//判定する日付の列 4 const ss = SpreadsheetApp.getActive(); 5 const sheet = ss.getSheetByName('シフト'); 6 //日付の列のデータを取得 7 const values = sheet.getRange(1, column, sheet.getLastRow(), 1).getValues().flat(); 8 const today = new Date();//今日の日付 9 today.setHours(0, 0, 0, 0);//比較のため時刻をクリア 10 let row = 0;//日付の行番号を保存 11 for (let i = 0; i < values.length; i++) { 12 if (Object.prototype.toString.call(values[i]) == '[object Date]') { 13 const date = values[i]; 14 console.log(date); 15 if (date >= today) { 16 //今日以降の日付なら保存した日付の前の行までを非表示 17 if (row > 1) { 18 sheet.hideRows(1, row - 1); 19 } 20 break; 21 } else { 22 //今日より前の日付なら行番号を保存 23 row = i + 1; 24 } 25 } 26 } 27}

投稿2023/10/02 04:01

編集2023/10/04 01:00
YellowGreen

総合スコア861

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

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

a802

2023/10/03 14:49

ご回答ありがとうございます!(コメント遅れましてすみません) やりたいこと叶いました!! 1つ理解できてないことがあるので教えていただきたいです。 sheet.hideRows(1, row - 1); の部分について、「row - 1」を「row - 2」にすると、 4行分(担当者名も含めた1週間分)が綺麗に残るのですが、 これはなぜでしょうか。 (好ましい挙動なので一旦は問題ないのですが) rowの1行前ということで、「夜:○○さん」の行が残ってしまうのではないかと思ったので、 気になっています。 日付がある行だけを認識するような処理があるのかなと思うのですが、場所が分かりませんでした。。。
YellowGreen

2023/10/04 00:59

ごめんなさい。 まず、 ご質問のコメントの状況を確認してみて、 コードの修正が必要なことが判明しましたので、 回答を修正してあります。 日曜日以外の日に実行しても動作するようにすることに気を取られ、 日曜日当日に実行したときの動作が1週間ずれていました。 次に、 row - 1については、 シートから取得したA列のデータを検索して 日付データにマッチするとその要素のインデックス(i)に1を加算した値を rowに代入(row = i + 1)しています。 これは、A列のデータは配列なのでインデックスが0から始まるのに対し、 行番号は1から始まるのでそのずれの分を1を加算することで合わせています。 このため、rowには日付の行の行番号が入っているので、 その一行前の行までを非表示にするためにrow -1としています。 iに1を加算せずにそのまま使うということもできますが、 趣旨がわかりにくくなるのでこのようにしています。
a802

2023/10/11 02:43

返信が遅くなり申し訳ありません。 修正もありがとうございます!! 時間かかってしまいましたが、内容理解できました。 ありがとうございました・・・!!
guest

0

行指定は非表示の行も含めて考えなくてはいけません。
なのでisRowHiddenByUserを使って判断しましょう。

投稿2023/10/01 08:40

YAmaGNZ

総合スコア10542

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

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

a802

2023/10/03 14:45

ご回答ありがとうございます。 今回は他の回答者様の内容でやってみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問