SPIDERPLUS Tech Blog

建設SaaS「スパイダープラス」のエンジニアとデザイナーのブログ

ChatGPTに気付かされる「便利」と「説明下手」

非エンジニアでも可能な自動化!ChatGPTとGoogleAppsScriptで効率アップ

こんにちは!
CREチームのくっきーです。

突然ですが、日々の作業の中でやりたいことに対して工程が多く『面倒だな…』と思うことありませんか?
エンジニアの方々は自分たちの技術で自動化ツールの作成等を進めていくことでしょう。
しかし!非エンジニアは手段がなく我慢するなんてことも少なくはありません…
今回は私の所属していたテストチームで上がった『煩わしさ』を自分ではコードを書かずにChatGPTに書いてもらって解消しようというお話です。
今更そんな話?と思うかもしれませんが、お付き合いいただけると嬉しいです!

ある日の振り返り会にて

「テスト実行開始後のテストケース修正が面倒だ!」という議題が上がりました。
えっ?文字を修正するだけなのに面倒?と思った方もいらっしゃると思います。

何故面倒なのか? 

弊社ではテスト仕様書を運用上、再利用可能な「原本」と、当時の実行結果を残す目的で「実行ファイル」と呼んでいる原本をコピーし、テスト結果を記載するファイルの2ファイルを保持しています。
そのためテスト実行開始後に修正する場合には以下2点の手間が発生します。
1.修正対象が「原本」と「実行ファイル」の2ファイルを用意する手間
2.他者が作成している異なる階層にある実行ファイルを探す手間
例えば誤字を直すためだけに上に挙げた作業をするとなるとうんざりですよね…

修正するのは1ファイルだけにしたい!

打合せの結果、「原本に直接テスト結果を記載し、実行が完了したらファイルをコピーしてテスト結果を消して保管すればよい」という意見が出ました。
修正が発生するのであれば確実に楽になることでしょう。
ただし修正することの方が少ない今、これを手動でやることは結局手間が増えるだけ。
「こんな固定作業ならプログラムでやってくれないかな…」
そう願ってしまいますよね。

プログラムを書けないなら書いてもらおう!

タイトル通り、ChatGPT※に書いてもらいます!
※弊社で導入しているChatGPT Qを利用しました。GPT-4に対応しており、OpenAIのAIモデルに学習されることなく、Slack上で安全に利用出来るサービスです。

※この記事を公開した2024年5月16日の前日、5月15日にGPT-4oにアップデートされました!

q-bot.suchica.com

最終的に投げた依頼と回答はこちら。

依頼内容

引数としてフォルダIDを渡すのでそれをもとに以下を満たすGoogleAppsScriptのコードを作成せよ

  1. 同一階層に「テスト仕様書原本」というフォルダを作成し、渡したフォルダIDの内にあるファイルを全てコピーすること。作成時に「テスト仕様書原本」という同一名称のフォルダが既に存在した場合、フォルダを削除してから作成すること。
  2. コピーしたファイルの名称に関して「_確認者」という文字が含まれていた場合、それ以降の文字を「_確認者XX修正」に置き換えること
  3. コピーしたファイルの全シート関して、H8セルに「結果」、K8セルに「確認者」、L8列に「日付」が設定されているシートの場合、H~M列の9行目以降のセルの内容をクリアすること

※参考図

ChatGPTの回答

要件を更新したスクリプトを以下に示します。このスクリプトは、指定されたフォルダ内のファイルをコピーし、特定の条件を満たすシートのセル内容をクリアします。

javascript
function copyAndModifyFiles(folderId) {
  const sourceFolder = DriveApp.getFolderById(folderId);
  const folderName = 'テスト仕様書原本';
  let targetFolder;

  // 既存の「テスト仕様書原本」フォルダがあれば削除し、新しく作成する
  const folders = sourceFolder.getParents().next().getFoldersByName(folderName);
  while (folders.hasNext()) {
    let folder = folders.next();
    folder.setTrashed(true); // フォルダを削除
  }
  targetFolder = sourceFolder.getParents().next().createFolder(folderName); // 新しいフォルダを作成

  // ファイルのコピーと名称変更
  const files = sourceFolder.getFiles();
  while (files.hasNext()) {
    const file = files.next();
    let fileName = file.getName();
    // ファイル名に「_確認者」が含まれている場合、置換する
    if (fileName.includes('_確認者')) {
      fileName = fileName.replace(/_確認者.*/, '_確認者XX修正');
    }
    const copiedFile = file.makeCopy(fileName, targetFolder);

    // シートの内容をクリアする条件を満たしているかチェック
    clearSheetContentsIfNeeded(copiedFile);
  }
}

function clearSheetContentsIfNeeded(file) {
  const mimeType = file.getMimeType();
  // スプレッドシートのみ処理を行う
  if (mimeType === MimeType.GOOGLE_SHEETS) {
    const spreadsheet = SpreadsheetApp.openById(file.getId());
    const sheets = spreadsheet.getSheets();
    sheets.forEach(sheet => {
      // H8セルに「結果」、K8セルに「確認者」、L8列に「日付」が設定されているかチェック
      if (sheet.getRange('H8').getValue() === '結果' &&
          sheet.getRange('K8').getValue() === '確認者' &&
          sheet.getRange('L8').getValue() === '日付') {
        // 条件を満たす場合、H~M列の9行目以降のセルの内容をクリア
        const lastRow = sheet.getMaxRows();
        if (lastRow > 8) {
          sheet.getRange(9, 8, lastRow - 8, 6).clearContent();
        }
      }
    });
  }
}

このスクリプトは、以下の手順で動作します:

  1. 指定されたフォルダIDのフォルダ内に「テスト仕様書原本」という新しいフォルダを作成します。同名のフォルダが既に存在する場合は、そのフォルダを削除してから新しいフォルダを作成します。
  2.  元のフォルダ内の全ファイルを新しいフォルダにコピーし、ファイル名に「_確認者」が含まれている場合は、それ以降の文字を「_確認者XX修正」に置き換えます。
  3. コピーされた各ファイルがGoogleスプレッドシートの場合、特定の条件を満たすシートのセル内容をクリアします。条件とは、H8セルに「結果」、K8セルに「確認者」、L8列に「日付」が設定されているシートで、これらの条件を満たすシートについては、H~M列の9行目以降のセルの内容をクリアします。
    このスクリプトを実行する前に、Google Apps Scriptのプロジェクトにこのコードを貼り付け、`copyAndModifyFiles`関数に適切なフォルダIDを引数として渡してください。

フォルダIDだけ定義してあげれば、やりたいことが実現できます!
ありがとうChatGPT!!

ChatGPTとのやり取りで気付いた事

何といっても便利!

ChatGPTを使えば、非エンジニアでもプログラミングをせずに作業を自動化できるという点が便利なことは言うまでもありません。

自分は「説明下手」である

一方で、個人的には「欲しい物を完璧に伝えた!」と思っていたものの、考慮・説明が不足している点に気づかされました。
私は初回の質問でスクリプトを完成させることができなかったのです。そこには2つの失敗がありました。

1個目の失敗は、3で指示したセルの内容がクリアできてなかった点です。
条件に入れたセル、比較文字列情報は合っているのにクリアできない…。
なので『複数シートあるから対象にしたいシートで実行されていないかも』という仮説をたて「コピーしたファイルの全シートに関して」という質問に訂正、再質問して回答を実行してみます。
するとセルの内容は正しく消えていました!

しかし、ここで2個目の失敗が発覚します。
「テスト仕様書原本」というフォルダが2個できていたのです。
理由はChatGPT側が「同一フォルダがある場合は既存フォルダを無視して新規で作成する」という定義にしたためです。
私の希望は「削除して再作成する」ですが、伝えてないのでそんな希望は通りません。なので「同一名称のフォルダが既に存在した場合、フォルダを削除してから作成すること」を定義に追加します。
これで最終質問の完成、スクリプトも期待通りに動きます!

私の今回の失敗は

  1. セルクリアの指示がどのシートを対象にするか的確に伝わっていなかった
  2. 「やりなおし(複数回実行)すること」を考慮できていなかった
    という2点です。

「どこで」「いつ」を質問時に整理できていれば防げた内容だと思うので、「手動でやるならこんな感じ」というざっくりとした定義で1回目の質問をしてしまいましたが、5W1Hという基本をおさえた形で作業指示するとより少ない回数で欲しい答えがもらえそうです。

最後に

ChatGPTの活用は、非エンジニアでも自動化の実現ができるという今後の期待が持てました!
同時に、「適切に全て指示すること」の難しさ・重要度に改めて気付かされました。
もっと活用してみてどういう指示を出せば欲しい答えが返ってくるのか探っていこうと思います!

ところで、スパイダープラスでは仲間を募集中です。

スパイダープラスにちょっと興味が出てきたなという方がいらっしゃったらお気軽にご連絡ください。最後までご覧くださり、ありがとうございます。