GASで案件ごとの日数を表示するようにしてみた

# やることになった理由
案件の進捗等を管理するためにチーム内でわかりやすいシートを作って欲しい！とのこと。
~~GAS使わない方が多いのでわからないのですがやることになりました~~


### シートを作る上で欲しい機能
<ul>
    <li>案件がいつから始まり、いつ終わるのか。</li>
    <li>WBSのような表示をしたい。</li>
    <li>今週がどこかを表示したい。</li>
    <li>終了まで残り数日となった時に一部色を変えたい。</li>
</ul>

### 実際に作ってみた。

:::note warn
注意
これより先のコードについては
・正常系前提であること（異常系は都度修正）
・急ぎで作成した（内部用で一旦作成したので、可読性等の配慮がないです）
上記のためコードが雑になっているかもしれません。
:::

シートのデザインについては添付画像のようにしています。
![スクリーンショット 2023-12-21 10.30.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2318223/ee915c02-7a4b-fe4d-9998-6a369e6dcb1a.png)

---

## 各列の説明
|   列名    |    要素内容    |
|:------------------:|:------------------:|
|        A        |        案件名        |
|       B       |       担当者       |
|        C        |        進捗        |
|         D         |         リリース判定         |
|       E       |       進捗矢印       |
|      F       |      開始日       |
|      G       |      納期       |
|      H       |      残日数       |
|      I       |      開始週（1月1日から何週目か）       |
|      J       |      納期週（1月1日から何週目か）       |

 ※ K列以降は1年を週で分割してそれぞれを表示するセルとして扱っています。

## GASに記述するコード


<details><summary>色変更やWBSのような書き方にする処理をまとめたコード</summary>

    const sheet = SpreadsheetApp.getActiveSpreadsheet();　
          const activeSheet = sheet.getActiveSheet(); // activeSheetを宣言
        
          const GValues = sheet.getRange('A4:A300').getValues();　//A列に案件名を記入するため、A列を基準とする。
          const lastRow = GValues.filter(String).length;
          const resetRange = 'K4:BK' + (lastRow + 3); // resetRangeの計算方法を修正
          activeSheet.getRange(resetRange).setBackground(null);
        
          for (let i = 4; i <= lastRow + 3; i++) { // ループの条件を修正
            const startRange = activeSheet.getRange(i, 9).getValue()-1;
            const lastRange = activeSheet.getRange(i, 10).getValue() >= startRange ? activeSheet.getRange(i, 10).getValue() : 53 ;
        
            for (let j = startRange; j < lastRange; j++) {
              activeSheet.getRange(i, 11 + j).setBackground('#6aa84f'); //塗りつぶすときの色を指定しています。
            }
          }
          
</details>

<details><summary>スプレッドシートを開いた時に呼ばれる処理</summary>

            function onOpen() {
              let activeSheet = SpreadsheetApp.getActiveSheet();
              var toweek_range = activeSheet.getRange(1,11,1,53);
              toweek_range.clear();
              var week_num_range = activeSheet.getRange(3,11,1,53);
              week_num_range.setBackground(null);
            
              var range_week = parseInt(Utilities.formatDate(new Date(), "GMT", "w")) + 10;
              var to_week = activeSheet.getRange(1,range_week,1,1);
              var to_week_num = activeSheet.getRange(3,range_week,1,1);
              to_week_num.setBackground('red');
              to_week.setValue("今週\n▼");
              to_week.setFontColor('red');//今週のテキストをお好みの色に変更してください
              to_week.setHorizontalAlignment('center');
            }
    
</details>



## 今後について
以下3点を優先的に修正したいと考えている。
<ul>
<li>ボタン形式からメニューバーに追加
<details><summary>コードはわかっているので、あとはカスタムして更新する。</summary>

                //on Openに追加
                let ui = SpreadsheetApp.getUi();
                let menu = ui.createMenu('チャート生成');
        
                // メニューをUiクラスに追加する
                menu.addToUi();

</details>
</li>
<li>年度を跨いだときに現状12/31までしかないので、別シートを生成してそこにデータが更新されるようにしたい。</li>
→シート生成するコードがあると思うので、こちら調査中。
<li>　コードが雑になっているのでこちらの修正を行いたい。</li>
→可読性の低いコードで終わらせるのは申し訳ないので、こちらは要修正。

</ul>