CONTACT

Magazine

マガジン
GAS

【ソースコードあり】ベンチャーなので名刺管理ツールをGASで作ってみた【作り方も載せます】

【ソースコードあり】ベンチャーなので名刺管理ツールをGASで作ってみた【作り方も載せます】

TL;DR:完成した名刺管理ツールの紹介

特定フォルダに社員ごとのフォルダを作成し、そこに名刺のjpg画像を格納することで自動的にスプレッドシートに名刺の情報が格納されるツールを作りました。

仕組みとしては「時間経過」をトリガーにGASのスクリプトが実行され、特定フォルダ以下の画像ファイルを「クローリング」し、未処理の画像があれば「OCR」→「ChatGPTで解析」をする、というものです。

はじめに

名刺管理ツールは市販のSaaSが数多く存在します。しかし、スタートアップやベンチャーの現場では「費用対効果が合わない」「機能が大きすぎる」「まずは最低限でいい」といった理由から、導入に踏み切れないことも少なくありません。

私たちのチームでも同じ課題を抱えていました。営業や社外折衝で毎日のように名刺が増えていく一方で、情報の整理は各自に任せきり。結果、

  • どの名刺がどこにあるのか分からない
  • Excelや手書きの管理で属人化してしまう
  • データ化が追いつかず、営業リストに活用できない

といった状態が起きていました。

そこで「市販ツールをいきなり導入する前に、自分たちで小さく作ってみよう」と考えました。幸いGoogle Workspaceを全社で利用していたため、Drive・スプレッドシート・Apps Scriptを組み合わせれば、最低限の名刺管理システムがすぐに作れそうです。さらに最近はChatGPTの活用で、OCRの結果をきれいに構造化することも可能になっています。

この記事では、「Driveのフォルダに名刺画像を置くだけで、自動でOCR → ChatGPTで整形 → スプレッドシートに反映する仕組み」を作ったプロセスを、ソースコード付きで解説します。小さく始めたいベンチャーやスタートアップにとって、役立つ参考になるはずです。

プロジェクトの全体像

以下がプロジェクトの全体像です。

  1. GASのスクリプトから、フォルダ内の画像ファイルを取得
  2. 未処理の画像ならGCP内の「Google Drive API」に含まれるOCR機能を活用して、名刺の画像を文字列化
  3. 帰ってきた文字列をChatGPTに構造化(JSON)させる
  4. JSONをパース(分解)し、スプレッドシートに記録

準備編:GCPとGASの設定

名刺管理ツールをGASで動かすためには、Google Cloud Platform(GCP)でAPIを有効化し、Google Apps Script(GAS)と連携させる必要があります。ここでは必要な準備をステップごとに解説します。

1. GCPプロジェクトの作成

まずはGCPで新しいプロジェクトを作成します。

  1. Google Cloud Console にアクセスし、右上のプロジェクト選択メニューから「新しいプロジェクト」をクリック
  2. プロジェクト名を入力(例:BusinessCardOCR)
  3. 作成を押す(「組織」と「場所」はデフォルトで大丈夫です)

2. Drive APIの有効化

次に、このプロジェクトで Google Drive API を有効化します。

  1. 画像赤枠部分で「Google Drive API」を検索
  2. 検索結果から「Google Drive API」を開く
  3. 「有効にする」をクリック

3. OAuth同意画面の設定

Google Drive APIを利用するためにOAuth同意画面の設定が必要です。

  1. 「APIとサービス」→「OAuth同意画面」を開く
  2. ユーザータイプを選択(社内利用であれば「内部」、外部公開なら「外部」)
  3. アプリ名、サポートメールアドレスを入力
  4. 以下の画像のボタンからスコープに「…/auth/drive」を追加
  5. 保存して完了

4. スプレッドシートとの紐付け(コンテナバインド型)

今回のプロジェクトは「スプレッドシートと連動する前提」なので、対象のスプレッドシートから直接GASを開きます。

  1. 名刺情報を保存するスプレッドシートを用意(シート名は data 推奨)
  2. スプレッドシートのメニューから「拡張機能」→「Apps Script」をクリック
  3. これでスプレッドシートと紐づいた(コンテナバインド型)GASが作成されます

5. 高度なGoogleサービスの有効化

最後に、GAS側でDrive APIを使えるように設定します。

  1. GASエディタを開き、メニューから「サービス」→「高度なGoogleサービス」へ
  2. Drive API v2 をONにする
  3. これで Drive.Files.copy(…) が使えるようになります

6. APIキーの設定

ChatGPTのAPIキーの取得方法などの記事はたくさんあるので、そちらを参考にしてください!

  • プロジェクトのプロパティを開く
    メニュー「プロジェクトの設定(歯車アイコン)」をクリック
    「スクリプトのプロパティ」欄を探します
  • スクリプトプロパティを追加
    「+追加」を押して新しいキーを追加
    名前: OPENAI_API_KEY
    値: OpenAIのAPIキー(例: sk-xxxx…

これで準備は完了です!
次章からは、実際にOCRとChatGPTを組み合わせて名刺を自動で構造化していく実装に入ります。

実装編:ソースコード

以下をGASのスクリプトエディタにコピペしてください。
PARENT_FOLDER_IDには名刺を格納するフォルダのURLの〇〇部分を入れてください
「https://drive.google.com/drive/u/1/folders/〇〇」

var PARENT_FOLDER_ID = "XXXXXXXXXXXXXXXXXX";  // 社員フォルダをまとめるフォルダID

function crawlAndProcess() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("data");
  var lastRow = sheet.getLastRow();

  var processedFiles = [];
  if (lastRow > 1) {
    var values = sheet.getRange(2, 1, lastRow - 1, 1).getValues();
    processedFiles = values.map(function(row) {
      return row[0];  // 1列目の値(ファイルID)
    });
  }

  var parent = DriveApp.getFolderById(PARENT_FOLDER_ID);
  var subFolders = parent.getFolders();

  while (subFolders.hasNext()) {
    var folder = subFolders.next();
    var employeeName = folder.getName();
    var files = folder.getFiles();
    

    while (files.hasNext()) {
      var file = files.next();
      if (processedFiles.indexOf(file.getId()) !== -1) {
        continue; // 既に処理済み
      }
      Logger.log(file);
      // --- OCR実行 (Advanced Drive Service 必要) ---
      var resource = {
        title: file.getName(),
        mimeType: MimeType.GOOGLE_DOCS
      };
      var ocrFile = Drive.Files.copy(resource, file.getId(), {ocr: true});
      var doc = DocumentApp.openById(ocrFile.id);
      var text = doc.getBody().getText();

      Logger.log("OCR完了");

      // ChatGPTで構造化
      var structured = callOpenAI(text);

      Logger.log(structured);
      // スプレッドシートに追記
      sheet.appendRow([
        file.getId(),
        employeeName,
        file.getName(),
        new Date(),
        structured.name || "",
        structured.company || "",
        structured.department || "",
        structured.position || "",
        structured.address || "",
        structured.phone || "",
        structured.email || "",
        structured.website || ""
      ]);

      // 中間ファイル(Google Doc)は削除
      DriveApp.getFileById(ocrFile.id).setTrashed(true);
    }
  }
}

function callOpenAI(text) {
  const API_KEY = PropertiesService.getScriptProperties().getProperty("OPENAI_API_KEY");
  const url = "https://api.openai.com/v1/chat/completions";
  const payload = {
    model: "gpt-4o-mini",
    messages: [
      {
        role: "system",
        content: "あなたはOCRされた名刺情報を必ず以下のキーでJSON化するアシスタントですJson以外のコンテンツは生成しないでください。: name, company, department, position, address, phone, email, website"
      },
      {
        role: "user",
        content: "以下のOCRテキストから名刺情報を抽出してください:" + text
      }
    ]
  };

  const response = UrlFetchApp.fetch(url, {
    method: "post",
    headers: {
      Authorization: "Bearer " + API_KEY,
      "Content-Type": "application/json"
    },
    payload: JSON.stringify(payload),
    muteHttpExceptions: true
  });

  const json = JSON.parse(response.getContentText());
  try {
    return JSON.parse(json.choices[0].message.content);
  } catch (e) {
    return {};
  }
}

運用編:自動化

名刺管理を日常的に使うには、「新しい名刺画像がアップロードされたら自動で処理される」ことが大切です。Google Apps Script では、時間主導型トリガーを設定することで、関数を一定間隔で自動実行できます。

1. トリガー画面を開く

  1. Apps Script エディタを開く
  2. 左側の時計アイコン「トリガー」をクリック

2. 新しいトリガーを追加

  1. 右下の「トリガーを追加」をクリック
  2. 実行する関数を crawlAndProcess に設定
  3. 実行するデプロイ → Head
  4. 実行ユーザー → 自分(アカウント)

3. イベントの種類を選択

  1. イベントのソース:時間主導型
  2. 時間ベースのトリガーのタイプを選択
    分ベース → 5分ごと、10分ごとなど
    時間ベース → 1時間ごと、2時間ごと
    日ベース → 毎日決まった時刻

例えば「1時間ごと」にすれば、Driveに追加された名刺画像を自動的にOCR & 保存してくれます。

実際に使ってみた感想

実際に社内でこの仕組みを運用してみると、いくつかの気づきがありました。

まず、技術的な側面では ChatGPTが返すJSONのフォーマットが必ずしも正しいとは限らない という課題がありました。時折、余計なテキストが混ざったり、JSONの波括弧が欠けていたりするケースがあり、その場合はスプレッドシートに正しく反映されません。プロンプトを工夫することで精度は改善しますが、「AIからの出力を前提にシステムを組む場合はエラーハンドリングが必須」という学びがありました。

次に、仕組みそのものを作るのは思った以上に簡単で便利でしたが、「名刺画像をDriveにアップロードする」という運用ルールを根付かせる方がはるかに難しい という現実に直面しました。どれだけ便利な仕組みでも、社員全員が日常的に使う習慣を持たなければ、データは蓄積されません。技術の課題よりも文化を浸透させる難しさの方が大きいと感じています。

そして最後に、実際に使ってみると 人間がこれまで目で確認していた情報整理を、かなりの部分AIに任せられるようになってきた という実感がありました。OCRとAIの組み合わせは、単なる自動化を超えて、知的労働の一部を置き換え始めています。こうした仕組みを日常的に取り入れることで、今後は名刺管理に限らずさまざまな業務で、AIによる労働力の代替が加速していくと強く感じました。

まとめ

今回紹介した名刺管理ツールは、Google Drive API の OCRChatGPT による構造化、そして GAS + スプレッドシート を組み合わせることで、比較的簡単に実現できました。
システム自体は短時間で構築できますが、実際に使い続けるには「名刺画像をアップロードする文化を根付かせること」が大きな課題です。

一方で、AIを組み合わせることで、これまで人間が手作業で行っていた判断や整理の一部を自動化できることを強く実感しました。こうした仕組みを小さく作って運用してみることが、今後の業務効率化やAI活用の第一歩になると考えています。