見出し画像

実践編:ChatGPTに手伝ってもらう

話題のAI:ChatGPT様にプログラムのお仕事を手伝って頂こうと思います。

ChatGPTの使う用途としてはいろいろ考えられますが今回は自分の書いたプログラムのリファクタリングをお願いしてみます。

リファクタリング とは、コンピュータプログラミングにおいて、プログラムの外部から見た動作を変えずにソースコードの内部構造を整理することである。

ウィキペディア

まずは openai.com にログイン

https://chat.openai.com/chat

↑メールアドレス登録してログイン
↓無事ログインできればこのような画面がでます

リファクタリングしてもらう

今回は↓で書いたプログラムを使います。
実践編:Google Workspace:GAS(App Script)で当番通知

画面の下部のメッセージボックスに

”以下のソースコードをリファクタリングしてください。”
(Shift + ENTERで改行して続けて↓のコードを貼り付け)

function sendChat(msg)
{
  var url = "https://chat.googleapis.com/v1/spaces/xxxxxxxx"

  var message = {'text': msg}
  var options = {
    'method': 'POST',
    'headers': {
      'Content-Type': 'application/json; charset=UTF-8'
    },
    'payload':JSON.stringify(message)
  };
  
  UrlFetchApp.fetch(url, options);
}

function myFunction() {
  
  const mySheet = SpreadsheetApp.getActiveSheet()
  const lastRow = mySheet.getDataRange().getLastRow()
  const values = mySheet.getDataRange().getValues()
  const toDay = new Date();
  
 
  for(let i=0; i < lastRow; i++)
  {
    const name = values[i][0]
    const date = values[i][1]

    if(!date || 
      date.getFullYear() != toDay.getFullYear() ||
      date.getMonth() != toDay.getMonth() ||
      date.getDate() != toDay.getDate()
    )
    {
      sendChat(`今日の当番は${name}です`)
      mySheet.getRange(i+1,2).setValue(toDay)
      break
    }
  }

}

ちゃんとリファクタリングしてくれます

どのように修正したかも解説してくれます

もし文章が英語になっていたら
”日本語で解説してください”とチャットしてください

注意点

ただChatGPTの言うことは鵜呑みはできません。

if(!date || 
      date.getFullYear() != toDay.getFullYear() ||
      date.getMonth() != toDay.getMonth() ||
      date.getDate() != toDay.getDate()
    )

↑リファクタリングされる前のプログラムを↓のように変えてしまっては結果が変わってしまいます。

if (!date || date.getTime() !== today.getTime())

”日単位で違う” ➔ ”秒単位で違う” に変わってしまっています。

同じ質問をしても結果が毎回違う

どのように変更したか聞かないと答えない事もある

まとめ

現段階では当たりとして活用して最終チェックは人の目で確認が良いかと思います。

おまけ

リファクタリング以外にもイチからプログラムを作成してくれます。

React でポップアップコンポーネントを実装してください。
以下は React でポップアップコンポーネントを実装する例です。

追記( 2023/02/16)

修正依頼をする

ChatGPTの使い方に慣れてきた今日この頃。
再度リファクタリングについて検証してみたところ
リファクタリング内容が悪い場合には「◯◯が間違えているので修正してください」と指摘すると結果が良くなるとわかりました。

function sendChat(msg) {
  const url = "https://chat.googleapis.com/v1/spaces/xxxxxxxx";
  const message = { 'text': msg };
  const options = {
    'method': 'POST',
    'contentType': 'application/json; charset=UTF-8',
    'payload': JSON.stringify(message)
  };
  UrlFetchApp.fetch(url, options);
}

function getCurrentDuty() {
  const sheet = SpreadsheetApp.getActiveSheet();
  const values = sheet.getDataRange().getValues();
  const today = new Date();

  for (let i = 0; i < values.length; i++) {
    const name = values[i][0];
    const date = values[i][1];

    if (!date || date.toDateString() !== today.toDateString()) {
      sheet.getRange(i + 1, 2).setValue(today);
      return name;
    }
  }
  return null;
}

function myFunction() {
  const name = getCurrentDuty();

  if (name) {
    sendChat(`今日の当番は${name}です`);
  }
}

リファクタリングのポイントは以下の通りです。

optionsオブジェクトの'Content-Type'プロパティを'contentType'プロパティに変更しました。また、optionsオブジェクトを定義するときに、constキーワードを使用しました。
「今日の当番」を取得するための処理を、getCurrentDuty()という関数にまとめました。この関数は、シートから値を読み取り、今日の日付と比較し、当番の名前を返します。シートの更新は、この関数内で行っています。
getCurrentDuty()関数がnullを返す場合は、sendChat()関数を呼び出さないようにしました。name変数に値がある場合にのみ、sendChat()関数を呼び出します。
if文で日付の比較を行うときに、getFullYear()、getMonth()、およびgetDate()メソッドを使用する代わりに、toDateString()メソッドを使用しました。これにより、比較を単純化し、コードを短くしました。

関数にまとめたところは素晴らしいですね。さらに関数名も明確で役割も良い。

toDateString こんな関数あったんですねw

この記事が気に入ったらサポートをしてみませんか?