【非エンジニア向け】 AIにGoogle Apps Script書かせて非エンジニアが業務を自動化してみた

【非エンジニア向け】 AIにGoogle Apps Script書かせて非エンジニアが業務を自動化してみた

Clock Icon2025.02.06

三度の飯より推しが好きなアノテーションのはらしまです。どうもこんにちは。

巷ではAIが流行りに流行って、さまざまなAIであふれかえっていますね。先日、私の推しが「友達いないからAIにいろいろ相談してる」 なんて話をしていて、一般に浸透してきていると実感しました。
ですが、そんなAIをどう活用していいのかわからない方も多いと思います。そこで、今回は「AI使えば非エンジニアでも自動化ツール作れるんだぜ!」というところを、実際の事例を交えてお話ししていきます。

困りごと・やりたいこと

私の所属するチームでは、月ごとの実績をスプレッドシートで管理しています。過去実績を残すために、手動でコピーしたシートをバックアップとして残しているのですが、ついうっかりバックアップをとらずに直接シートを変更し始めてしまい、あとから「あ…バックアップ忘れたやん…(絶望)」となることが多々ありました。
なので、うっかりしてても大丈夫なように毎月1日に自動でバックアップシートを作成してくれるGoogle Apps Script(以下GAS)を作ってみることにしました!

前提

  • 私の残念スペックw
    • pythonを勉強して、classが理解できなくて挫折した程度の知識量
    • AIもGASもなんとなくこんなことはできると知ってる程度
    • Apps Scriptの基本操作はできる
  • 使用したツール
    • スプレッドシート & Apps Script
    • クラスメソッドで提供しているAI-Starter (どのAIが適しているのかわからないので、とりあえずGPT-4oを選択)

事前準備

まずはスプレッドシートの準備です。と言っても大したことはしません。
必要な項目(今回はサンプル項目です)を入力して、シート名を設定するだけです。シート名は『2025/01』のように毎月変動するようなシート名にはしないことがポイントです。バックアップをとりたいシート名が変動してしまうと、毎回スクリプトに書かれたシート名を変更しないといけなくなるので、『作業用シート』や『当月分』などの名称で固定にしておくと便利です!

次にやりたいことをある程度分解しておきましょう。

  • いつ自動バックアップするのか? → 毎月1日のAM8:00
  • 『作業用シート』をコピーする
  • コピーしたシートのシート名を前月の年月にする(今月が2025/02なら、2025/01)
  • 作業用シートは項目だけ残してリセットする

さて、実際にやってみましょう

まずは実現したいことをAIに渡してみる

では実際にAIパイセン(急なパイセン呼びw)に聞いてみましょう。私は読解力をどこかへ忘れてきてしまった人間なので、まずは『これからお願いごとをするので、小学生でも理解できるように説明してほしいです』というプロンプトを渡しておきます。
そして、AIパイセンはほんの少しだけドジっ子ちゃんなので、一気にすべての処理を実現しようとすると一部抜けることがあります。なので、分けて指示してあげるのがおすすめです。

『毎月1日のAM8:00に、スプレッドシートの指定したシートのバックアップを取りたいです。具体的なスクリプトは書かなくて良いので、一旦できるかできないかで答えてください。』

と聞くと、『はい、できます!』 と元気に答えてくれました。
可能であることが判明したので、次の指示を出します。

『では、以下の処理をおこなうGASを書いてください。

  • 作業用シートをコピーする
  • コピーしたシートのシート名を前月の年月にする(今月が2025/02なら、2025/01)
  • 作業用シートは項目だけ残してリセットする 』

これに対する返答がこちら↓


以下は、リクエストされた処理を行うGoogle Apps Script (GAS) のコード例です。このスクリプトは、Googleスプレッドシート内の「作業用シート」をコピーし、前月の年月をシート名に設定し、元の「作業用シート」をリセットします。

function backupAndResetSheet() {
  // スプレッドシートを取得
  const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();

  // 作業用シートを取得
  const sourceSheet = spreadsheet.getSheetByName("作業用シート");
  if (!sourceSheet) {
    throw new Error("作業用シートが見つかりません");
  }

  // 現在の日時から前月の年月を取得
  const now = new Date();
  const year = now.getMonth() === 0 ? now.getFullYear() - 1 : now.getFullYear(); // 1月の場合は前年
  const month = now.getMonth() === 0 ? 12 : now.getMonth(); // 1月の場合は12月
  const previousMonthName = `${year}/${month.toString().padStart(2, '0')}`; // 前月の年月 (例: 2025/01)

  // 作業用シートをコピーして名前を変更
  const copiedSheet = sourceSheet.copyTo(spreadsheet);
  copiedSheet.setName(previousMonthName);

  // 作業用シートをリセット
  sourceSheet.clear(); // すべてのデータを削除
  const range = sourceSheet.getRange(1, 1, 1, sourceSheet.getLastColumn());
  range.setValues([range.getValues()[0]]); // 1行目(項目)を残す
}

スクリプトの動作

  1. 「作業用シート」をコピー
    指定された「作業用シート」をコピーします。
  2. コピーしたシートの名前を前月の年月に変更
    現在の月を基に、前月の年月を計算し、それを新しいシートの名前に設定します。
  3. 「作業用シート」をリセット
    作業用シートのデータをすべて削除しますが、1行目(項目)は残します。

注意事項

  • シート名の重複: 前月の年月を名前にしますが、既に同じ名前のシートが存在する場合はエラーになります。必要に応じてエラーハンドリングを追加してください。
  • スクリプトの実行タイミング: 毎月1日のAM8:00に実行するには、Google Apps Scriptのトリガー機能を設定する必要があります。

トリガーの設定方法

  1. スクリプトエディタのメニューから「時計アイコン」(トリガー)をクリック。
  2. トリガーを作成し、backupAndResetSheet 関数を選択。
  3. 時間ベースのトリガーを設定し、「日付ベースのタイマー」→「特定の日時」→「毎月1日 AM8:00」に設定します。
    これで、スクリプトが自動的に毎月1日に実行されます!

こんな感じで、処理内容の説明やアドバイスまでしてくれます。

返ってきたGASを設定して動かしてみる

さてさて。じゃあ早速このGASを設定してみようじゃないか。
スプレッドシートの拡張機能『Apps Script』を開いて、エディタに先ほどのGASをペタッとペーストして保存。そして実行!!
non-engineer-gas-automation-with-ai_3
…おや?何かエラーが発生したようです。

どんなエラーか説明させる

ここで、私はAIパイセンに 『Exception: The number of columns in the range must be at least 1. っていうエラーが出たんだけど原因教えて?』 と伝えました。すると、

『エラーの原因は、sourceSheet.getLastColumn() が 0 を返している可能性があることです。つまり、「作業用シート」が空で、データがまったくない状態だと、このエラーが発生します。』

という返答がきました。
あー、なるほど。ついうっかりなんのデータもないままの状態で実行してしまったというわけですね。
そんなうっかりさんな私を尻目に、AIパイセンは空のシートでもエラーにならないように勝手に修正してくれてます!さすがっス!!

修正して再度実行してみる

修正してもらったGASをまたペタッと貼り付けて再度実行。
non-engineer-gas-automation-with-ai_4
ふおぉぉぉぉぉぉぉぉ!!!ちゃんとバックアップシートが作成されとる!!
じゃあ作業用シートはどんな様子なのかしら?
non-engineer-gas-automation-with-ai_5
…おやおや?項目名消えてるくさいな。いや、でももしかしたら項目名だけでサンプルデータ入れてないからそうなってるだけかもしれん。サンプルデータを投入して実行してみよう。(ちなみに、項目名を伝えればサンプルデータもAIパイセンが用意してくれます)
non-engineer-gas-automation-with-ai_6
KI E TE RU ☆
いやいや、消されたら困るねん。これは直してもらわないと!!

処理が違いそうな箇所を指摘 → 修正

ここでの指示は『作業用シートのリセット時、作業用シートの項目名までリセットされてしまいます。作業用シートの1行目は残してください。』 です。
返ってきたGASをまたペタリして実行。
non-engineer-gas-automation-with-ai_7
おめでとうございます!正しく処理が完了しました!!
…いや、ちょっと待て。そういえば最初にエラーハンドリングがどうたらこうたら言ってたよね?これもついでに実装してもらおうか。

『最初に言ってたエラーハンドリングってのも実装してくれる?』

で、修正してくれたGASをペタリして、あえてエラーが出る(同じ名前のシートが存在する)状態で実行。
non-engineer-gas-automation-with-ai_8
うおおおおおおおお!!ちゃんとできてる!!
私天才!!(アナタじゃありません。AIパイセンのほうです。)
…ってな感じで、少しずつ修正したり、足りない処理を追加してもらったりしながら、思い通りの処理になるまで修正と実行を繰り返します。

最後にできあがったGASをレビューしてもらう

ここまで作ってもらったはいいけど、レビューをするほどの知識はありません。なので、できあがったGASをAIパイセン自身にレビューしてもらうことにしました。
全部のせるのは長くなるので割愛しますが、良い点と改善点をアレコレ教えてくれます。
そして最終的にでき上ったGASがこちら↓

function backupAndResetSheet(sheetName = "作業用シート") {
  // スプレッドシートを取得
  const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();

  // 作業用シートを取得
  const sourceSheet = spreadsheet.getSheetByName(sheetName);
  if (!sourceSheet) {
    Logger.log(`${sheetName} が見つかりません`);
    return; // 処理を終了
  }

  // 現在の日時から前月の年月を取得
  const now = new Date();
  const year = now.getMonth() === 0 ? now.getFullYear() - 1 : now.getFullYear();
  const month = now.getMonth() === 0 ? 12 : now.getMonth();
  let previousMonthName = `${year}-${month.toString().padStart(2, '0')}`; // 前月の年月 (例: 2025-01)

  // シート名の重複を回避する
  previousMonthName = getUniqueSheetName(spreadsheet, previousMonthName);

  // 作業用シートをコピーして名前を変更
  const copiedSheet = sourceSheet.copyTo(spreadsheet);
  copiedSheet.setName(previousMonthName);

  // 作業用シートをリセット
  const lastRow = sourceSheet.getLastRow();
  const lastColumn = sourceSheet.getLastColumn();

  if (lastRow > 1) {
    sourceSheet.getRange(2, 1, lastRow - 1, lastColumn).clearContent();
  }
}

function getUniqueSheetName(spreadsheet, baseName) {
  const existingSheetNames = spreadsheet.getSheets().map(sheet => sheet.getName());
  let uniqueName = baseName;
  let counter = 1;

  while (existingSheetNames.includes(uniqueName)) {
    uniqueName = `${baseName}_${counter}`;
    counter++;
  }

  return uniqueName;
}

おおおおおお!!なんかよくわからないけどできた!!最初に提示されたGASから進化してますね、多分(進化したかどうか判定する知識はない)
あとは毎月1日のAM8:00に実行されるようにトリガーを設定して終わり。

…ふふ…ふははは!!これでまた1つワイは楽になれるんや…!!

ついでに

これ以上は長くなるので簡単に書きますが、ついでにAIパイセンにお願いしたことをメモしておきます。

  • どんな処理が行われているのか1行ずつ説明させる
    • どこの処理が間違っているのかを、説明してもらった中から見つける(やりたいことが複雑になるほど、指示とは違うことをやってしまう可能性が高くなる)
    • 「そこちゃうで。こうやで。」って指摘する
  • 手動バックアップボタンを作成
    • エディタを開けば手動実行できるのでなくてもいいけど、開くのめんどくさいなってときにあると便利
    • 図形にスクリプトを割り当てるか、AIパイセンに「メニューバーに『手動バックアップ』というメニューを作るGAS教えて」とお願いする

おわりに

再度お伝えしますが、私は非エンジニアです。お作法だとかメンテナンス性の良さだとかは全然わかりません。プロの皆さんから見て「ここをこうするともっといいよ!」というご意見ありましたら、教えていただけるとはらしまさん喜びます!

「業務を自動化したいけど、エンジニアじゃないから…」と悩んでいるみなさん、ぜひAIパイセンを頼ってみてください!きっといいアドバイスをくれるはずですよ。
ほかにもAIを使って自動化した事例もありますので、また次の機会にご紹介していけたらと思います(^^)

アノテーション株式会社について

アノテーション株式会社はクラスメソッドグループのオペレーション専門特化企業です。サポート・運用・開発保守・情シス・バックオフィスの専門チームが、最新 IT テクノロジー、高い技術力、蓄積されたノウハウをフル活用し、お客様の課題解決を行っています。当社は様々な職種でメンバーを募集しています。「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、アノテーション株式会社 採用サイトをぜひご覧ください。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.