あれっ！“自動化”って意外と簡単！？【ChatGPTとGASでPDFを一括作成】

# 知らなかった！ChatGPTの隠れた実力！
どうもー！！はっちゃんです！！:wave:
某小売業の本社で働いています。店舗の生産性向上の為、プログラミングの勉強中です！
　
私は仕事で研修やセミナーの参加命令書を作成することがあり、
参加者ごとにドキュメントの加筆修正、保存の繰り返し作業に追われています・・・
多くて30名規模の参加者が集う研修もあり、それが複数回実施されますので、
参加命令書のパターンは“100”を超えることもあります:scream:

「**パターンごとに自動で資料が編集できて、保存までされたらいいよなぁ**:expressionless:」
　
そこで、ChatGPTが「プログラミングで必要なコードも生成できる」
優秀な生成AIだったことすらも知らなかった私が、ChatGPTの真の実力を試すべく、
「**“自動”でドキュメントをPDF化して一括作成すること**」にチャレンジしました！:muscle_tone3:

![名称未設定のデザイン (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822788/d75ab2c3-476e-c1c1-05d8-d3663a900c1e.png)

# :computer: 実現したいこと
**1. 　事前にテンプレートとなる“Googleドキュメント”を作成します。**
　
**2. 　ドキュメントに入力されている「氏名」「日付」「時間」などの可変項目を、
    　　“Googleスプレッドシート”からデータを取得して自動で置き換えます。**
　　
**3. 　自動でドキュメントからPDFを作成し、所定のフォルダに保存します。**
　
<details>
  <summary>:hammer_pick: 使用したツール</summary>
・ChatGPT

・Google Apps Script(GAS)

・Googleドキュメント

・Googleスプレッドシート
</details>

【実現したいことのイメージ】
![Plan (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822788/517c5147-61a1-4e2a-420a-d79703ea4981.png)

# :wrench: 実装手順
## 事前準備
### :arrow_forward: テンプレート用のGoogleドキュメント作成
テンプレートとなるドキュメントを作成します。
今回は「研修の参加命令書」として作成してみました！

テンプレートができたら、作成したドキュメントのURLを確認します。

:::note info
URLには「ドキュメントのID」が含まれています。
URLの「1から始まり、スラッシュ(/)の手前部分」がIDとなります。(下図参照)
このIDは、後ほどGASでコードを貼り付けた際に使用します。

![画像5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822788/883a7a73-5451-c5de-dde5-93463d6a58ff.png)

:::

![画像2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822788/a1e9b9db-e016-6a41-8865-e5f1f8d45602.png)

### :arrow_forward: Googleドライブのフォルダ作成
一括作成したPDFを格納する為のフォルダを作成します。
こちらも先ほどのドキュメントIDと同様に、URLから「フォルダID」を確認します。

![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822788/3a6acfd8-e12b-900a-7856-2416cc5c8a06.png)




### :arrow_forward: Googleスプレッドシートの作成
データを取得して、
そのデータをドキュメントに置換する為のスプレッドシートを作成します。
シートの1行目はタイトル行で、データは2行目から始まります。
　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822788/73ee04aa-6e46-b9fe-17fa-545401cf6139.png)

## ChatGPTでコードを生成する
### :arrow_forward: プロンプトをつくる
以下がプロンプトの内容です。
[参考記事はこちらです　-プロンプトの書き方８つのコツｰ](https://excelcamp.jp/ai-bot/media/howto/14728/)
　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822788/2b86deee-0c4e-5f78-2b64-d66a231910be.png)

最後のプロンプトの
・「Google Apps Scriptはスプレッドシートにバインドされています」
・「変数の宣言はletとconstを使用してください」
難しい言葉が並んでいますよね・・・:sweat_smile:

そのプロンプトがない場合どうなるのか、ChatGPTに聞いてみました。
興味がある方は見てくださいね！！　
<details>
  <summary>:question:「バインド」と「変数の宣言」について</summary>

 スプレッドシートにバインドされていない場合、スプレッドシートに依存する機能（例えば、シートのデータを自動的に処理する機能やカスタムメニューを作成する機能）が利用できなくなるため、スプレッドシートと連携した自動化が難しくなります。

let と const を使用しない場合、コードの品質が低下し、予期せぬバグやエラーが発生しやすくなります。特に大規模なスクリプトや複数人で開発する際には、コードの可読性と保守性が大きく影響を受けます。

**これらのプロンプトがあることで、スクリプトが安全かつ効率的に動作するよう設計されていることが確認され、スプレッドシートとの連携もスムーズに行えるようになります。**

</details>

### :arrow_forward: コードを生成する
以下がChatGPTによって生成されたコードになります。
複雑なコードが一瞬で生成されます！すごすぎるー！！:blush:
　
![e2dde141cb55568ddc2980d1b2e1c070.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822788/510e1c7a-c50a-68ce-0077-73455fd86afe.png)
![9b7468fee4b4350ce4f3e2e5a37301b3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822788/43ebc286-ab80-6f62-7d81-1580bc2977f1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822788/470fd447-f700-cf49-13ed-a21c2062a6f4.png)

## GASを作成する
### :arrow_forward: 生成したコード貼り付けて実行する
スクリプトエディタを開いて、生成されたコードを貼り付けます。
さらに、さきほどの「テンプレート用ドキュメントのID」と「PDF保存用フォルダのID」を
2行目と3行目に入れて実行します。忘れずに入れましょう！！
　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822788/59f8aa83-459c-c496-ef9d-f1b650d777db.png)



:::note warn
「ドキュメントID」と「フォルダID」を入れずに実行すると、
　実行ログに以下のエラーが出ます:no_good_tone2:
![タイトル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822788/ba872b9a-0c20-5cdf-27d6-9126d05583db.png)

:::
 
### :arrow_forward: 作成されたファイル名とPDFの日付がおかしい！？
それでは、保存用フォルダを確認していきましょう。あらら・・・？？:hushed:
PDFは作成されていますが、よく見るとファイル名がおかしなことになっています。
さらに、PDFファイルを開くと、「発行日」とスケジュールの「日付」がおかしいです。
日時のデータをそのままドキュメントに入れた為、英語表記になっています。
　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822788/68d433cf-7fbb-8ec6-5172-e8dbe1b5e1fc.png)

![画像8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822788/3885649d-0cd6-45cc-e1e1-43606e27ee7d.png)
　
このままでは文書として使えないので、再修正していきます。
ChatGPTに追加で依頼してみます。(下図を参照)
可変データの項目毎にどのような形式で変換して欲しいか指定します。

再度修正されたコードも教えてくれました！
無事、期待通りのPDFファイルが作成されました！！:raised_hands_tone2:
　
![画像9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822788/53d2703f-cf5e-8adf-8c85-68235f9a8472.png)

![画像10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822788/f28f15ac-7ce7-b736-8d98-e2f8173aa3ba.png)


### :arrow_forward: もっと便利に！ カスタムメニュー実装
カスタムメニューというものを追加して、スプレッドシートに拡張機能を実装しました！
これ、スゴイ便利です！ぜひ試してみてください！
[参考記事はこちらです　-スプレッドシートにカスタムメニューを追加する方法-](https://uncle-gas.com/spreadsheet-custom-menu/)
　
カスタムメニューとは、簡単に言いますと、
スクリプトエディタを開かずとも、
スプレッドシート上でメニューを開けば、スクリプトがそのまま実行できる機能です！
これも、ChatGPTで楽々実装できます！:clap_tone2:
　
![画像11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822788/cb53b4a8-b253-99e0-4291-80128961bce6.png)

　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822788/4de98b11-6bb9-2449-a89c-9643d6ba22ba.png)


# :pushpin: 完成したのがこちら！
可変項目のデータが反映したドキュメントをPDF化し、所定のフォルダに保存されました！
カスタムメニューもいい感じ！！:two_hearts:
　
![3c9393c71d0ebda07ca4a9537936d097.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822788/e0c1d1b0-d71e-f0e9-cecf-5ab516643328.gif)



# :alarm_clock: 浮いた時間で“Let`s study”！
ChatGPTを使うことで、
制作に費やす時間を大幅に減らすことができました！
呪文のようなコードをゼロから書く手間を考えたら、スゴイことですよね！:hugging:

私は、制作時間短縮で創出できた時間を“勉強”に費やしました。
### :book: GASの自己学習
ビジネスシーンにおいて、GASをまったく使った経験がなかったので、
参考書を購入して勉強をしました。
ChatGPTの生成したコードに加え、スプレッドシートの関数も組み合わせれば、
より生産性の高いツールができると感じました。
「知らない」を「知っている」に変えることで、モノづくりの可能性が広がります！:books:
　
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f333832323738382f32636430393564392d356531342d313566372d306431372d3731396335303639653335352e706e6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822788/5fdefcde-5eca-f696-7250-2a83c7d1f7f2.png)




### :writing_hand_tone2: 仕事仲間と勉強会
私の仕事現場では週1回の定例ミーティング(Teamsのリモート会議)がありますので、
その場を借りて、私が学んだことをメンバーに共有する“勉強会”を実施しました。
PPTで簡易的な資料を作成し、
そもそも私が「どんなことをやっているのか？」という説明をしました。
その後、制作したツールの動作をメンバーに見てもらい、FBをいただきました！:bow_tone1:
仲間に感謝感謝です！！
　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822788/0bcba0e3-5524-c61d-9d33-382c15d5089f.png)

# :sunny: まだまだやれることはある！
### :envelope: 追加で実装したい機能
FBをいただきながら制作する過程の中で、やってみたい妄想がこみ上げてきました！
時間を見つけて、チャレンジしていきます！！
**①研修参加者の属性や要件によって、ファイルの保存先を振り分けたい。**
**②PDFファイルを添付して、メールを送信したい。**

### :raising_hand_tone1: 妄想を現実に！実際にやってみました！【24.09.01更新】

**:dividers: ファイルの保存先を振り分ける**
「**会社名でファイルの保存先を分ける**」プロンプトに修正してみました。
事前準備として、「会社名」を「フォルダ名」としたフォルダを新規で作成しておきます。

スクリプトエディタを開いて、新しいコードを貼り付けて実行すると・・・
会社名によってフォルダの振り分けをしてくれました！！お見事！！:clap_tone2:
　
![画像2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822788/95e99fa0-e0e1-7721-c47c-c413c84787e6.png)


![画像5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822788/b4b21198-de35-1cb0-eec1-9276ac9794c9.png)
　
**:envelope_with_arrow: ファイルを添付してメールを送信する**
事前準備として、スプレッドシートの1行目のタイトルに
「メールタイトル・宛先・メール本文」を入力します。2行目に各データを入力します。

さらに、今回は「**ファイル名と指定の文字列が一致するPDFファイル**」を
メールに添付させます。
　
![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822788/31da1cea-0613-60e1-170b-e66b308b39b2.png)


 　
メールを配信するプロンプトに加えて、
「**ファイル名と指定の文字列が一致している場合、PDFファイルを添付して欲しい**」
というプロンプトを加えました。
スクリプトエディタを開いて、新しいコードを貼り付けて実行すると・・・
指定のPDFファイルを添付してメールの送信ができました！！すばらしい～！！:clap_tone2:
　
![画像9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822788/ec4c59fa-d5ee-b527-fe5a-643bc31be3eb.png)

![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822788/20656165-62ae-3552-c32a-7e8f8f83c194.png)


### :thinking: 学んだこと
粗々な部分もありますが、やりたいことを形にすることはできました！
プロンプトの内容やスクリプトの組み合わせによっては、
まだまだ色んなことができそうです！！アイデアの数だけ可能性は広がります！！:bulb:

ただ、ChatGPTの情報がすべて正しいとは限りません。
**実現したいという<font color="Red">“目的”</font>を明確にしたうえで、
最終的には人間だからこそできる<font color="Red">“創造力や判断力”</font>も必要であると感じました。**
お互いの強みを活かしながら、共生していくことが大切ですね！

ここまでご覧いただき、ありがとうございましたー！！:wink:

#### 【参考記事】
https://note.com/taraco123/n/n53b662bcf8fc

https://note.com/workstream/n/n08e2d8b5fc5e

https://qiita.com/toki_mwc/items/aff7dc12a48b1782a475