マウスを1度も使わずに全体シフトの入力方法をChatGPTに教えてもらった。

## 選ばれたのはＧＡＳ(Ｇoggle Apps Script）でした。

**こんにちは、いらっしゃいませ！**
毎月のシフトの作成に悩まされているスーパーの店員の大橋です。

今回は、少し背伸びをしてGASのコードをChatGPTに教えてもらいながら今後のシフト作成を少しでも楽にする第一歩になります。

私のようなパソコンが苦手な方でも**無料**で**お手軽**に作れるので、目に留まったら一度試してみてはいかがでしょうか？


**ちなみに私のレベルは・・・・・**
休日のところ**〇**と１つ１つ打ち込んでいたり、連休のところはコピー貼り付けで作っていた残業製造機ですので、ご了承ください・・・・


## 完成したもの
https://x.com/i/status/1848942917697867803


## 用意するツール
１**Google Apps Script**
２**Google Spread Sheetに落としたシフト表**
３**ChatGPT**　　　

## 設定までの流れ
### １.使用するシフトの用意
用意できましたら、それを**Google Spread Sheet**に入れてください。

入れ方はこちらの記事を参考にどうぞ
https://allabout.co.jp/gm/gc/486414/

![シート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883532/1d89ea74-835f-1f09-2664-ca5ae06d3d7f.png)


まずは、ここの拡張機能を押します。


![スクリーンショット 2024-10-23 133726.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883532/ba4f821e-41f5-7509-4586-3188b137333f.png)

**AppsScript**こちらを押してください。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883532/434d8a94-7155-3e03-99b3-a7b7cc8319da.png)
ここまでいきましたら次は**ChatGPT**を使います。

**拡張機能**が出ない場合はこちらの記事をどうぞ。

https://qiita.com/candallorjun1025/items/09e8df5afa27e3402664

### ２.出番ですよChatGPT先生

それではコードをお願いしていきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883532/56dd7da9-9952-f7b3-501c-86417f5e3aac.png)
私がお願いしたらそれ用のコードを作ってくれます！
今回は、こういう質問
**スプレッドシート選択したセルをクリックで〇をつけたい。**
マウス使わないって言ったじゃんって思っている方、ちゃんと説明いたします。
最初はマウスでクリックして〇をつけたり消したりした方が速いって思ったからなんです。

この灰色で囲まれたコードの右上　**コードをコピーする**　をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883532/4f350345-ba5d-f3b1-a583-37fb95bcda5a.png)
コピーしたら先ほどの **AppsScript** に貼り付けます。
貼り付けたら丁度コードの真上にある **プロジェクトを保存** という
フロッピーディスクのマークをクリック。
そうしたら、**▷実行** をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883532/56b32d2e-8d80-65c3-ce2f-82f6fa0d953c.png)
あれ？エラーが起きてる・・・・・
でも大丈夫！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883532/51404aba-32fc-53f3-75dc-4b9e54ec5289.png)
このエラーをコピーして・・・
ChatGPTに貼り付ける！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883532/9eec5040-7b5f-7156-1b84-429065463096.png)
そうすると新しいコードに書き換えてくれるのでこれをまたコピーして
貼り付ける！

ただし！前回のコードが残ったままになっていますのでそれは、**消してから**貼り付けましょう！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883532/e15384c7-34b9-1ba8-e9ce-903df6207dbb.png)

:::note alert
初めてGASを利用する場合、「このアプリはGoogleでは確認されていません」という文言が出てきますので「詳細」を選択し、左下の 「安全ではないページ]」をクリックして許可をすれば警告文がなくなります。
:::

それでは実際にシートに戻って動作確認をしてみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883532/addd14c4-2eba-d1ef-f6f0-ba043d304f2d.png)
あれ何も動かない？？この場合は

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883532/1157860c-9ac6-86a2-5ddf-2b2540e82fb3.png)

左の**トリガー**の設定ができていない場合が多いんだそうです。実際ここでつまづきました。
それでは、設定していきましょう。まずは、右下の **＋ トリガを追加** をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883532/52235e3e-a457-4959-a222-9a59ada7b2d6.png)

この設定にしてください。

![スクリーンショット 2024-10-23 145906.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883532/25ad9e10-7d2a-133e-2178-d97bb98f7bea.png)
よしこれで・・・・だいじょばない。。。。プロジェクトに戻って原因を見てみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883532/fb9b7391-3ee5-67a0-f72d-cec618dc066c.png)
今度は左の実行数を見てみると何かが失敗しています。
(１番右のステータスの部分ですね。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883532/03b09496-cd6a-ef71-e7f3-d71ddbd86aba.png)

このエラーも先ほど同様ChatGPTに送ってあげましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883532/25ede6c9-1253-acd0-3666-abdb8a6bb8ea.png)
エラーが消えます。
**ここで消えない場合 エラーをコピー してChatGPTに貼り付けてコードを何回も書き直しさせましょう。**

![スクリーンショット 2024-10-23 145906.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883532/58c13fe7-10b9-05a1-497d-e95579637792.png)
ただ依然として言うこと聞いてくれません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883532/c97a0a8c-5cdf-c4be-7274-0a40ef71d0e2.png)
**A以外**の文字を置き換える？
いやいや全ての文字を置き換えてくれ・・・・・ChatGPTに文句言ったら返ってきました。


```ruby
function onEdit(e) {
  if (!e) return; // 手動実行時には何もしない

  var range = e.range; // 編集されたセルの範囲を取得
  var sheet = range.getSheet();

  // 対象の範囲を指定
  var targetRange = sheet.getRange("C5:AF24");

  // 対象範囲内かを確認
  if (isCellInRange(range, targetRange)) {
    range.setValue('〇'); // すべての編集内容を〇に置き換え
  }
}

// セルが範囲内にあるか確認する関数
function isCellInRange(range, targetRange) {
  var targetRowStart = targetRange.getRow();
  var targetRowEnd = targetRange.getLastRow();
  var targetColumnStart = targetRange.getColumn();
  var targetColumnEnd = targetRange.getLastColumn();
  
  var editedRow = range.getRow();
  var editedColumn = range.getColumn();
  
  // 編集されたセルが範囲内にあるかを確認
  return (editedRow >= targetRowStart && editedRow <= targetRowEnd &&
          editedColumn >= targetColumnStart && editedColumn <= targetColumnEnd);
}
```

これを張り付けました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883532/5e223d9e-1e1d-5f54-68ba-17afeeef6b9a.png)
お！動いた！動いた！　やっと動いたわ。。。
ただ感動したのもつかの間・・・・・
あれ？バックスペースキーを押しても消えない・・・・なぜだ？
消えたと思ったらまた出てくる・・・・・
ここは、何回もChatGPTとやり取りしたんですが結論！
**バックスペースキー** も押すと文字としてカウントされてしまうことがわかりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883532/8b8ba59d-5511-ba6e-02a4-096c66c88c61.png)
これで・・・頼む・・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883532/fbb72b19-df9f-237a-ad50-fd85b5d93866.png)
お！お！ｷﾀ━━━━(ﾟ∀ﾟ)━━━━!!
どの文字押そうが全て〇に代わる！バックスペースキーを押しても出現しない！

もう少しいろいろ試してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883532/a75a6ba5-9281-59a0-c506-324cda5f3d77.png)

何をしたいかというと

![スクリーンショット 2024-10-23 145906.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883532/85171f3f-57a5-dc8c-732e-00fb278713ee.png)
私が今回練習用に使用したシフト表はAF列までAG列は基本触らないところです。
なので、ここでEnterキーを押せば次の人のところに自動でカーソルが行くようにしてみたといううわけです。
これでTabキーで横移動しながら休日のところに適当な文字を入力しても〇表記になりEnterキーを押せば次の段に行くためマウスを使わないでシフトの一覧入力が可能になりました。
本当はクリック形式で〇を表示できればと思ったんですがChatGPTの返答は、クリックだけでアクションはできないそうです。なんどやってもチェックボックスの方へ誘導させられました。
もしやり方ご存じの方いらっしゃいましたらご教授お願いいたします。

### ３.最終的に出来上がったコード

```ruby
function onEdit(e) {
  if (!e) return; // eが存在しない場合は終了

  var range = e.range; // 編集されたセルの範囲を取得
  var sheet = e.source.getActiveSheet(); // 編集されたシートを取得

  // 許可された範囲を定義 (C5:AF24)
  var allowedRange = sheet.getRange("C5:AF24");

  // 編集されたセルの行と列を取得
  var row = range.getRow();
  var col = range.getColumn();

  // 許可された範囲の行と列の境界を取得
  var allowedRowStart = allowedRange.getRow();
  var allowedColStart = allowedRange.getColumn();
  var allowedRowEnd = allowedRowStart + allowedRange.getNumRows() - 1;
  var allowedColEnd = allowedColStart + allowedRange.getNumColumns() - 1;

  // 編集されたセルが許可された範囲内にあるか確認
  if (row >= allowedRowStart && row <= allowedRowEnd && col >= allowedColStart && col <= allowedColEnd) {
    if (range.getNumRows() === 1 && range.getNumColumns() === 1) { // 編集された範囲が1セルのみの場合
      var currentValue = range.getValue();

      // セルが空になった場合は何もしない
      if (currentValue === "") {
        return; // セルが空の時は処理を終了
      }

      // トグル：現在の値が「〇」なら空に、そうでなければ「〇」にする
      if (currentValue === "〇") {
        range.setValue(""); // セルの内容を空にする
      } else {
        range.setValue("〇"); // セルの内容を「〇」にする
      }

      // 行の最終列（AF列）に到達した場合、次の行のC列に移動
      if (col === allowedColEnd) {
        var nextRow = row + 1; // 次の行を計算
        if (nextRow <= allowedRowEnd) {
          sheet.getRange(nextRow, allowedColStart).activate(); // 次の行のC列に移動
        }
      }
    }
  }
}
```

## 大変だったところ
とにかくChatGPTへの指示ですね。新入社員に仕事を教える感覚に近いと思います。
具体的に具体的に要望を上げなければ、どこかしらでエラーが出てしまいます。
あとは、根気との戦いです。できないんじゃないかと途中で投げ出さずに目的地までたどり着くことが
いいもの作ることへつながったんだと思います。

## ChatGPTに触れてみて
すごい便利！いまだどういう原理でこのコードが動いているのかわからないのですが納得のいくものが作れた喜びがとても大きいです。レベルUPに何回も戦うんじゃなくて「ふしぎなあめ」を使ったような感覚です。
また、GAS、これがとにかく便利！次はPDFから、いろいろ抜き出せないか、ChatGPTとともに挑戦してみようと思います。