はじめに
データビジネス事業本部のキタハラです。
私は普段、営業として、クライアントへの提案活動や案件の進行管理を担当しています。
IMの営業は、比較的定型な作業や簡単な自動化は、エンジニアに頼らず、自分たちで手を動かしてスピード重視で対応する文化があります。
私の業務の中に「クライアントから送られてくるシミュレーション依頼(Excel)をもとに、BigQueryでターゲット抽出を行う」というフローがあるのですが、これが1日に数十件来ることもあり、とにかく手作業が多くて大変でした。
- SlackにExcelが届く
- Excelを開いて条件を確認
- 条件に合わせてSQLを手書きで修正・作成
- BigQueryで実行し、結果を整形して返信
「手作業が多くて、他の人に案件を引き継ぐ時に大変なんだよな……」
そんな悩みを解消するため、プログラミング知識はそこそこですが、生成AI(Gemini)を相棒にして自動化ツールを作ってみました!
今回は、「要件定義と指示出しは人間(営業)」「コーディングはAI」という役割分担で進めた開発の裏側をご紹介します。
作成したツールの全体像
処理フロー
営業担当である私が「こうなったらいいな」と考えたのは、以下の自動化フローです。
- Slack監視: チャンネルに「シミュレーション」という名前のExcelが来たら勝手に拾う。
- データ抽出: 人間が見るためのExcelから、プログラムが読めるデータを無理やり引っこ抜く。
- DB化: 抽出したデータをスプレッドシート(マスターシート)に貯める。
- SQL生成: ここが一番面倒な「条件分岐だらけのSQL」を自動で作る。
- 結果整形: 出てきた数字を、チャットで報告しやすい形(「◯◯件、合算◯◯件」)に整える。
システム構成図
AIとの開発プロセス
今回、コードを書く作業は ほぼ100% 生成AI(Gemini/ChatGPT) に任せました。
私がやったのは「やりたいことを日本語で伝える」ことと「エラーが出たらAIに怒る(相談する)」ことだけです。
AIに任せてよかったポイント
1. 面倒すぎるExcelの読み込み処理
営業資料あるあるですが、Excelって「セル結合」されていたり、「項目の隣にチェックボックスがあったり」と、人間には見やすくてもプログラムで読むには厄介な構造をしています。
自分でコードを書こうとしたら「getRange(2, 3)が……」と座標指定だけで心が折れていたと思いますが、AIにこう指示しました。
「XXX」という文字が入っているセルの、隣のセルの値がTRUEだったら取得する、みたいな関数作って!
すると、汎用的な検索関数をサクッと書いてくれました。文系職の私には魔法に見えました。
// AIが作成してくれた「ラベルを探して値を取ってくる」関数
const getValueByLabelFromRange = (sheet, label, labelColumnIndex, valueColumnIndex, searchRangeA1) => {
// 中身はよく分かりませんが、指定範囲からラベルを探してくれるそうです
// ...(省略)
};
2. 条件分岐だらけのSQL生成
ここが今回のツールで一番の難所でした。
- 項目によって別の条件が必要だったり不要だったり
- 検索条件には正規表現が必要だったり
とルールが複雑なのです。
これを私が手書きのIF文で書くと絶対にバグる自信があったので、ビジネスロジック(業務ルール) だけをAIに伝えました。
種目が A の時はこの条件式を追加して。でも B の時は条件はいらないから無視して。
その結果、AIが提案してくれたのが、以下のような構造化されたコードです。
// 生成されたコードの一部(SQL構築ロジック)
function buildBigQuerySubQuery(bqSyumokuName, segmentInfo, originalSyumokuHeader) {
// ...
// 価格条件を入れるかどうかの判定ロジック
// 複雑なCASE文もAIが間違いなく書いてくれました
subQuery += `
AND CASE
WHEN ${actualUnderValue} IS NOT NULL ... THEN (
norm_kakaku BETWEEN ${actualUnderValue} AND ${actualUpperValue}
)
ELSE TRUE
END`;
return subQuery;
}
実装に際しての(AIからの)アドバイス
開発中、AIから「コードを整理しましょう」と提案されて、いくつか構成上の工夫をしました。
エンジニアの方から見れば当たり前かもしれませんが、営業の私にとっては「なるほど!」と思うことばかりでした。
1. 設定値(定数)を別ファイルに分ける
「後から『種目名を変更したい』となった時に、コードの奥底を探すのは大変ですよ」とアドバイスをもらい、Constants.gs というファイルに設定値をまとめました。
これで、何か仕様変更があってもここだけ直せばOKになりました。
2. 変換ルールをリスト化する
Excel上の指示を、BigQueryが理解できる「正規表現」に変換する辞書(マッピング)も、定数ファイルに外出しにしました。
これなら、「新しい条件が増えた」という時も、私一人でメンテできそうです。
// Constants.gs
const MADORI_REGEX_MAP = {
'首都圏': '東京|神奈川|千葉|埼玉',
'関西': '大阪|京都|奈良',
};
開発を終えての所感
1. 「仕様」さえわかっていれば作れる
以前であれば、Slack APIの仕様を英語のドキュメントで調べたり、正規表現のテストで数日悩んだりしていたと思います。
AIとペアプロすることで、それらの「技術的な壁」をスキップして、「このロジックで業務的に正しいか?」という仕様の検証に時間を使えました。
2. コードが読めなくても「ログ」があればなんとかなる
AIにコードを書かせると中身がブラックボックスになりがちですが、
「処理の合間に細かく Logger.log を入れて、今何をしているかコンソールに出るようにして」
と指示しておいたのが正解でした。
エラーが出ても「あ、ここで止まってるな」とわかるので、そのログをそのままAIに貼り付けて修正依頼が出せました。
まとめ
今回は、営業担当の私がGASとSlack API、そしてAIを活用して、日々の定型業務ツールを爆速で開発した事例を紹介しました。
特に、「『あのお客さんには、こんなデータを見せたら響くかも?』とアイデアを出し、すぐに数字で確かめる」 ような、「正解がない中で、ベストな答えをスピーディに探し出す動き」 こそ、私たちビジネス職の腕の見せ所です。
「やりたいこと」さえ自分の中に持っていれば、AIという最強の相棒がそれを形にしてくれます。
そこをAIに翻訳してもらう今の開発スタイルは、非エンジニアにこそ大きな武器になると感じました。
今後も、AIと共に業務ハックを続けていきたいと思います!
ここまで読んでいただき、ありがとうございました!
他のインティメート・マージャーの記事もぜひどうぞ!
また、インティメート・マージャーでは新卒から中途まで、幅広く採用を行っています!
少しでもご興味を持っていただけた方は、ぜひ採用ページもご覧ください!