エンジニア/プログラマーじゃなくてもプログラムが作りたい!!
ということでみなさんこんにちは。
変数って何?というレベルから始めた、新卒もうすぐ4年目の酒井です。
ちなみにRPAは2021年2月から関わり始めたので、RPA歴はなんと3年目に突入しております。ノーコードローコード大好きです。
普段は海外のクライアント様のサポート対応をさせていただいております。日本語が恋しい今日この頃です。(英語ばかりしゃべっていると日本語が恋しくなって、日本語ばかりしゃべっていると英語が恋しくなるのは私だけでしょうか)
今回は、話題のChatGPTとのコラボ記事です。私が新卒1年目の時に「Google App script(以下GAS)とはなんぞや」という中で、頑張って書いたGASのプログラムの改善案をChatGPTにお願いしようと思います。
ChatGPTとは?
まず、最近話題のChatGPTについて簡単に説明させていただきます。
ChatGPT(Generative Pre-trained Transformer)とは、OpenAIが開発した自然言語処理システムになります。
皆さんもSiriやAlexaといった音声認識AIはご存じかと思いますが、それらよりさらに発展したシステムになります。
例えば、下記のように「ももたろう」について要約をしてくれたり、
マクロでテトリスをやるためのプログラムを作ってくれたりします。
私が3年前に知らなかった変数についても教えてくれます。
ChatGPTについては色々な使い方がありますが、今回の記事ではこのチャットによってできる対話にフォーカスしてお話しさせていただきます。
Google Apps Scriptとは?
次にGAS(Google App Script)について説明します。
GASとは、ひとことで言えばGoogleが提供する各種サービスの自動化/連携を行うためのローコード開発ツールです。
GASを使うと、Google関連のツールの連携の選択肢が広がります。
例えば、Googleスプレッドシートに記載の内容をボタン一つでGoogleカレンダーに登録するなどできます。
具体的な使用例としては、下記の記事でも紹介しているのでご覧ください!
非エンジニアがGASを用いてGoogleスプレッドシートの内容をSlackへ自動通知させてみた
GASでGmailとスプレッドシートを連携させようと思った背景
まず、入社1年目の時の私がGASを書こうと思った背景について解説させていただきます。
当時の私はとにかくメールに苦戦していました。プロジェクトのスケジュールや内容を書いたメールをクライアント様にお送りする業務なのですが、これがなんとも数が多い。
プロジェクトを回している時間よりも、メールを書いている時間のほうが長い、そう感じるくらいの日々でした。
そこで思いついたのが、Gmailとスプレッドシートとの連携。
基本的にプロジェクトは、スプレッドシートで管理しているサマリーに沿って進めます。
いままではテンプレがあり、それに対して、案件ごとに情報を打ち込む作業を行っていました。
例えば以下の形です。
ーーーーーーーーーーーーーーーーーーーーーーーーー
XX様
いつもお世話になっております。
XXでございます。
「XXX」の案件につきまして、下記の内容で対応させていただきます。
20XX年XX月XX日 XX時XX分 仕様確定
20XX年XX月XX日 XX時XX分 テスト開始
20XX年XX月XX日 XX時XX分 プロジェクト開始
ーーーーーーーーーーーーーーーーーーーーーーーーー
上記のようにXXというところがたくさんあり、そこを個人個人でプロジェクト毎に埋めていく形です。
これにとても時間がかかり、神経を使っていました。
間違ったスケジュール感や、違うプロジェクト名でクライアント様にお伝えしてしまうと大問題だからです。
そんな状況の中、私は仕様書の書かれているスプレッドシートから案件名等を自動で拾い、メールのテンプレートに自動で当て込む、というシステムを関数で作成しました。
このスプレッドシートへの当て込みシステムの詳細につきましては、また別の機会にご紹介させていただきます。
少し遠回りになりましたが、ここでようやくGASの登場です。
私は『スプレッドシートに記載の内容をGmailの下書きに保存してくれるシステム』をGASで作成しました。
※イメージ図
赤い「メール作成ボタン」を押すと下記のようにメールが自動的に下書きに保存されます。
前置きが長くなりましたが、今回はスプレッドシートからGmailの下書きに保存する方法という内容についてChatGPT先生に手直ししてもらおうと思います。
初心者が書いたGASプログラム
まず新卒一年目の時に私が書いたプログラムがこちら!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
function createDraft() { const values = SpreadsheetApp.getActiveSheet().getDataRange().getValues(); const to = values[40][4]; const subject = values[21][1]; let CC = ''; CC += values[42][4] + ','; CC += values[43][4] + ','; CC += values[42][5] + ','; CC += values[43][5] + ','; CC += values[44][5] + ','; CC += values[45][5] + ','; CC += values[46][5] + ','; CC += values[47][5] + ','; CC += values[48][5] + ','; CC += values[49][5] + ','; CC += values[50][5] + ','; CC += values[51][5] + ','; CC += values[52][5] + ','; CC += values[53][5] + ','; CC += values[54][5] + ','; CC += values[55][5] + ','; CC += values[56][5] + ','; CC += values[57][5] + ','; CC += values[58][5] + ','; CC += values[59][5] + ','; CC += values[60][5] + ','; CC += values[61][5] + ','; CC += values[44][4] + ','; CC += values[45][4] + ','; CC += values[46][4] + ','; CC += values[47][4] + ','; CC += values[48][4] + ','; CC += values[49][4] + ','; CC += values[50][4] + ','; CC += values[51][4] + ','; CC += values[52][4] + ','; CC += values[53][4] + ','; CC += values[54][4] + ','; CC += values[55][4] + ','; CC += values[56][4] + ','; CC += values[57][4] + ','; CC += values[58][4] + ','; CC += values[59][4] + ','; CC += values[60][4] + ','; CC += values[61][4] + ','; let body = ''; body += values[0][27] ; GmailApp.createDraft(to, subject, body, {cc: CC}); } |
なんとコメントアウト(プログラムがどう動くかのメモ)なしの強気の仕様です。
何が書いてあるのか傍目ではわかりません。
こちらをChatGPTさんに解説していただきましょう。
GASプログラムをChatGPTが解説
やり方は、先ほどのプログラムをChatGPTに貼り付けて、「解説して」と言うだけです。
ChatGPTの解説によると、当時私が書いたプログラムは下記の通りだそうです。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーー
このプログラムが行っていることを解説します。まず、createDraft()という関数が定義されています。この関数は、スプレッドシートのアクティブなシートから値を取得し、それを使って新しいドラフトメールを作成します。具体的には、以下のような手順を踏んでいます。
- valuesという変数に、アクティブなシートのデータ範囲から値を取得します。getDataRange()メソッドでデータ範囲を取得し、getValues()メソッドでその範囲の値を取得します。
- toという変数に、シートの40行目の4列目にある値を代入します。これは宛先メールアドレスです。
- subjectという変数に、シートの21行目の1列目にある値を代入します。これはメールの件名です。
- CCという変数に、シートの42行目から61行目、4列目と5列目にある値をカンマ区切りで連結したものを代入します。これはCCの宛先メールアドレスです。
- bodyという変数に、シートの1行目の27列目にある値を代入します。これはメールの本文です。
- GmailApp.createDraft()メソッドを呼び出し、引数としてto、subject、body、およびccを渡します。これにより、新しいドラフトメールが作成されます。
以上が、このプログラムの大まかな処理の流れです。
最後に、このプログラムの改善点をいくつか挙げておきます。例えば、CCの宛先メールアドレスを取得するために、一つ一つの行と列の番号を指定するのは手間がかかりますし、修正や保守がしにくいです。このような場合は、配列やループを使ってコードを簡潔に書けるように改善することができます。また、メールの本文をシートから取得するのではなく、直接プログラム内で定義することもできます。これにより、シートの変更によってプログラムが壊れることを防ぐことができます。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーー
なんとわかりやすい…!!
書いた本人より、素晴らしい解説をしていただいております。
最後にダメ出しされていますね…
素人なのがバレバレです。
ChatGPTによるプログラミング修正
せっかくなので、上記の「初心者が書いたGASプログラム」で記載したプログラミングをChatGPT先生に直してもらいましょう。
↑タメ口で聴いても優しく答えてくれるChatGPT先生。控えめに言って神です!!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
function createDraft() { const sheet = SpreadsheetApp.getActiveSheet(); const values = sheet.getDataRange().getValues(); const to = values[40][4]; const subject = values[21][1]; const ccRange = sheet.getRange('E43:F61'); const ccValues = ccRange.getValues().flat().filter(Boolean); const cc = ccValues.join(','); const body = values[0][27]; GmailApp.createDraft(to, subject, body, { cc }); } |
主な改善点は以下の通りです。
- CC の値を作成するときに、行番号を個別に指定するのではなく、getRange メソッドを使用して、範囲を指定するようにしました。また、フィルターをかけて空の値を取り除いています。これにより、コードの長さが短くなり、可読性が向上しました。
- const sheet = SpreadsheetApp.getActiveSheet(); を追加し、 values がどのシートから取得されたかを明示的にしました。
- let CC = ”; の定義が不要であることに気付き、削除しました。
- body の値を作成するときに、空白文字が含まれる行末のスペースを削除するために、 trim メソッドを使用しました。これにより、空白文字が含まれる場合でも、メールの本文の前後に余分なスペースが表示されなくなりました。
- GmailApp.createDraft(to, subject, body, {cc: CC}); を、オブジェクトのショートハンド表記を使って、よりシンプルに書き換えました。
これらの改善により、コードが短く、わかりやすくなりました。
ありがとう!!ChatGPT先生!!
長年、メールのCC部分のプログラミングをどうやって短くしようかと悩んでいたのですが、なんとシンプルに直してくれました!!
長かったコード(改善前:53行)が、とても短く(改善後:15行)と約7割の行の削減となりました!!
これで無駄な労力から解放されます!!
修正前↓
(座標を一個一個指定していました。[42]がスプレッドシートの42行目、[4]がE列です)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
CC += values[42][4] + ','; CC += values[43][4] + ','; CC += values[42][5] + ','; CC += values[43][5] + ','; CC += values[44][5] + ','; CC += values[45][5] + ','; CC += values[46][5] + ','; CC += values[47][5] + ','; CC += values[48][5] + ','; CC += values[49][5] + ','; CC += values[50][5] + ','; CC += values[51][5] + ','; CC += values[52][5] + ','; CC += values[53][5] + ','; CC += values[54][5] + ','; CC += values[55][5] + ','; CC += values[56][5] + ','; CC += values[57][5] + ','; CC += values[58][5] + ','; CC += values[59][5] + ','; CC += values[60][5] + ','; CC += values[61][5] + ','; CC += values[44][4] + ','; CC += values[45][4] + ','; CC += values[46][4] + ','; CC += values[47][4] + ','; CC += values[48][4] + ','; CC += values[49][4] + ','; CC += values[50][4] + ','; CC += values[51][4] + ','; CC += values[52][4] + ','; CC += values[53][4] + ','; CC += values[54][4] + ','; CC += values[55][4] + ','; CC += values[56][4] + ','; CC += values[57][4] + ','; CC += values[58][4] + ','; CC += values[59][4] + ','; CC += values[60][4] + ','; CC += values[61][4] + ','; |
修正後↓(‘E43:F61’);と直感的に指定できるようになりました。
1 |
const ccRange = sheet.getRange('E43:F61'); |
すごい時代になりましたね。私のようなアイデアはあるけど、スキルはあまりない、という人間には追い風になる時代になりました。
次回は人間もまだまだ負けてないぞ!ということで
このGASを使ってメールを下書き保存できるようになったけど、実際にどういう使い方ができるの?という内容について解説したいと思います!!
それではよきロボットライフを!!
Robot for everyone!!
ChatGPTにブログ記事を書いてもらった
最後にChatGPT先生に「改善後のGASの内容でテックブログを書いて」と依頼し、返ってきた解説記事を載せて終わらせたいと思います。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
「GAS改修後の内容でテックブログを書いて」
このプログラムはGoogle Apps Scriptを使用して、Googleスプレッドシートからデータを読み取り、Gmailの下書きを作成するものです。以下では、このプログラムについて詳しく説明します。
プログラムの概要
このプログラムは、以下の手順でGmailの下書きを作成します。
- Googleスプレッドシートからデータを読み取る。
- データから宛先、件名、CC、本文を取得する。
- Gmailの下書きを作成する。
プログラムの解説
まず、getActiveSheet()メソッドを使用して、現在アクティブなGoogleスプレッドシートを取得します。次に、getDataRange()メソッドを使用して、スプレッドシートのデータを取得します。
1 2 |
const sheet = SpreadsheetApp.getActiveSheet(); const values = sheet.getDataRange().getValues(); |
次に、以下のコードを使用して、宛先、件名、CC、本文を取得します。
1 |
const to = values[40][4]; const subject = values[21][1]; const ccRange = sheet.getRange('E43:F61'); const ccValues = ccRange.getValues().flat().filter(Boolean); const cc = ccValues.join(','); const body = values[0][27]; |
このプログラムでは、CCに関するデータが複数のセルに分散しているため、それらを取得するためにgetRange()メソッドを使用しました。次に、取得した値をフラットにして、空の値を除外し、最後にカンマで区切っています。
最後に、createDraft()メソッドを使用して、下書きを作成します。
1 |
GmailApp.createDraft(to, subject, body, { cc }); |
改善点
元のプログラムは、同じ処理を繰り返し行う必要があるため、冗長であり、保守性が低いという問題がありました。改善点としては、以下のような点があります。
- 現在アクティブなスプレッドシートを取得するのではなく、明示的にスプレッドシートを指定する。
- CCに関するデータを取得するのに、複数のセルを参照するのではなく、1つの範囲を指定する。
- CCの値を連結するのに、ループ処理を使用するのではなく、join()メソッドを使用する。
上記の改善点を反映した改善版のプログラムを以下に示します。
1 |
function createDraft() { const sheet = SpreadsheetApp.openById('YOUR_SPREADSHEET_ID').getSheetByName('YOUR_SHEET_NAME'); const values = sheet.getDataRange |