ChatGPT APIで名刺データを効率的に分類する方法 - スプレッドシート×ChatGPT活用

- 手動での名刺情報の入力に時間がかかっている方
 - 名刺データ入力を自動化して業務を効率化したい方
 
前回の記事で、名刺のデータをOCR(画像から文字を読み取る技術)とGASを使ってスプレッドシートに転記する方法をご紹介しました。
ですが、その状態だとA列に名刺全体の情報が転記されています。
今回の記事では、ChatGPT APIを活用してA列にあるデータを各項目(会社名、氏名、役職、電話番号など)の列に振り分けてもらう方法をご説明します。

完成イメージ
データ整理前

データ整理後(ChatGPT APIを使用)

A列に名刺の情報が転記された後、ChatGPT APIを使って各項目に情報を振り分けます。
スプレッドシートには「会社名」「部署名」「氏名」「役職」などの列があり、該当する列にデータが入力されます。
ChatGPT APIの準備

GASのスクリプト作成の前にChatGPT API キーを取得する必要があります。
APIキーの取得方法については、別の記事でご紹介していますので、そちらをご参照ください。

手順

読み取った名刺の情報が転記された状態のスプレッドシートを使用します。
名刺情報の読み取り・転記については以下をご参照ください。


function myFunction(){
}
が最初から入っているため、消去して以下のスクリプトを貼り付けます。
// Google Apps Scriptを使用して名刺情報をChatGPT APIで分割するスクリプト
// 名刺情報を解析する関数
function parseBusinessCard() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const dataRange = sheet.getRange("A2:A" + sheet.getLastRow());
  const data = dataRange.getValues();
  data.forEach((row, index) => {
    const cardInfo = row[0];
    const rowIndex = index + 2;
    const isRowAlreadyParsed = sheet.getRange(`B${rowIndex}:L${rowIndex}`).getValues()[0].some(cell => cell !== "");
    if (cardInfo && !isRowAlreadyParsed) {
      const parsedData = getChatGPTParsedData(sheet, cardInfo);
      updateSheetWithParsedData(sheet, rowIndex, parsedData);
    }
  });
}
// ChatGPT APIから解析データを取得する関数
function getChatGPTParsedData(sheet, cardInfo) {
  const apiKey = PropertiesService.getScriptProperties().getProperty("OPENAI_API_KEY");
  const url = "https://api.openai.com/v1/chat/completions";
  const headers = sheet.getRange("A1:L1").getValues()[0];
  const headersJson = headers.reduce((acc, header) => {
    acc[header] = "";
    return acc;
  }, {});
  const messages = [{ "role": "user", "content": `以下の名刺情報を項目別に分けて、次のJSON形式で出力してください: ${JSON.stringify(headersJson)}: ${cardInfo}` }];
  const options = {
    "method": "post",
    "headers": {
      "Authorization": `Bearer ${apiKey}`,
      "Content-Type": "application/json"
    },
    "payload": JSON.stringify({
      "model": "gpt-4",
      "messages": messages,
      "max_tokens": 500,
      "temperature": 0.7
    })
  };
  try {
    const response = UrlFetchApp.fetch(url, options);
    const json = JSON.parse(response.getContentText());
    const parsedData = JSON.parse(json.choices[0].message.content.trim());
    return parsedData;
  } catch (error) {
    Logger.log("ChatGPT APIからデータを取得する際のエラー: " + error);
    return null;
  }
}
// 解析データをスプレッドシートに更新する関数
function updateSheetWithParsedData(sheet, rowIndex, parsedData) {
  if (parsedData) {
    const headers = sheet.getRange("A1:L1").getValues()[0];
    headers.forEach((header, index) => {
      sheet.getRange(rowIndex, index + 1).setValue(parsedData[header] || "");
    });
  }
}
// ChatGPT APIキーをスクリプトプロパティに設定する関数
function setApiKey() {
  const apiKey = "OPENAI_API_KEY";
  PropertiesService.getScriptProperties().setProperty("OPENAI_API_KEY", apiKey);
}
スクリプトの説明
- スクリプト概要
 - 
Googleスプレッドシート内にまとめられた名刺情報をChatGPT APIを使って解析し、各項目(会社名、部署名、役職、氏名など)に分類してスプレッドシート内のそれぞれの列に入力します。
名刺情報は改行で区切られて一つのセルにまとまっている状態で、このスクリプトを実行すると各情報が対応する項目に振り分けられます。
また、既に分類済みの行はスキップするようにしており、重複処理を防ぎます。
今回の例では、ChatGPTのモデルとトークン数を以下で設定しています。
- 使用するChatGPTのモデル:GPT-4
 - 最大トークン数:500
 
 parseBusinessCard()名刺情報を解析する関数- 
// 名刺情報を解析する関数 function parseBusinessCard() { const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); const dataRange = sheet.getRange("A2:A" + sheet.getLastRow()); const data = dataRange.getValues(); data.forEach((row, index) => { const cardInfo = row[0]; const rowIndex = index + 2; const isRowAlreadyParsed = sheet.getRange(`B${rowIndex}:L${rowIndex}`).getValues()[0].some(cell => cell !== ""); if (cardInfo && !isRowAlreadyParsed) { const parsedData = getChatGPTParsedData(sheet, cardInfo); updateSheetWithParsedData(sheet, rowIndex, parsedData); } }); }dataRange:スプレッドシートのA列(A2から最終行まで)のデータを取得します。data.forEach:A列の各行のデータを順に処理します。isRowAlreadyParsed:B列からL列のセルに既にデータが存在する場合、その行はスキップします。getChatGPTParsedData():ChatGPT APIを呼び出し、名刺情報を各項目に振り分けたJSON形式で返します。updateSheetWithParsedData():解析結果をスプレッドシートに反映させます。
 getChatGPTParsedData(sheet, cardInfo)ChatGPT APIから解析データを取得する関数- 
// ChatGPT APIから解析データを取得する関数 function getChatGPTParsedData(sheet, cardInfo) { const apiKey = PropertiesService.getScriptProperties().getProperty("OPENAI_API_KEY"); const url = "https://api.openai.com/v1/chat/completions"; const headers = sheet.getRange("A1:L1").getValues()[0]; const headersJson = headers.reduce((acc, header) => { acc[header] = ""; return acc; }, {}); const messages = [{ "role": "user", "content": `以下の名刺情報を項目別に分けて、次のJSON形式で出力してください: ${JSON.stringify(headersJson)}: ${cardInfo}` }]; const options = { "method": "post", "headers": { "Authorization": `Bearer ${apiKey}`, "Content-Type": "application/json" }, "payload": JSON.stringify({ "model": "gpt-4", "messages": messages, "max_tokens": 500, "temperature": 0.7 }) }; try { const response = UrlFetchApp.fetch(url, options); const json = JSON.parse(response.getContentText()); const parsedData = JSON.parse(json.choices[0].message.content.trim()); return parsedData; } catch (error) { Logger.log("ChatGPT APIからデータを取得する際のエラー: " + error); return null; } }headers:スプレッドシートの1行目(A1)にあるヘッダー(項目名)を取得し、それを基に分類する形式を指定します。messages:APIに送信するメッセージを作成します。このメッセージには、名刺情報をJSON形式で項目別に分ける指示を含んでいます。UrlFetchApp.fetch():ChatGPT APIにリクエストを送信し、解析結果を取得します。parsedData:APIからの応答をJSON形式で解析し、名刺情報を各項目に分割したデータを返します。
 updateSheetWithParsedData(sheet, rowIndex, parsedData)解析データをスプレッドシートに更新する関数- 
// 解析データをスプレッドシートに更新する関数 function updateSheetWithParsedData(sheet, rowIndex, parsedData) { if (parsedData) { const headers = sheet.getRange("A1:L1").getValues()[0]; headers.forEach((header, index) => { sheet.getRange(rowIndex, index + 1).setValue(parsedData[header] || ""); }); } }headers:スプレッドシートの1行目にあるヘッダー項目を取得し、それに基づいて解析結果を各列に入力します。sheet.getRange().setValue():解析結果をスプレッドシートの対応するセルに入力します。
 setApiKey()ChatGPT APIキーをスクリプトプロパティに設定する関数- 
// ChatGPT APIキーをスクリプトプロパティに設定する関数 function setApiKey() { const apiKey = "OPENAI_API_KEY"; PropertiesService.getScriptProperties().setProperty("OPENAI_API_KEY", apiKey); }- ChatGPT APIキーをスクリプトプロパティに保存するためのものです。
 - APIキーを設定しておくことで、ChatGPT APIとの通信が可能になります。
 
 

コードを書いたら、名前をつけて保存します。
(例:「名刺データ分類」)

名刺データが各項目に入力されます。
その後、入力された内容に問題ないか人の目でチェックを行います。
まとめ
この記事では、ChatGPT APIを使ってスプレッドシートのA列にある名刺データを各項目に振り分ける方法をご紹介しました。
最終的には分類後の内容を人の目でチェックする必要がありますが、名刺情報を効率的に整理することができます。
ChatGPT API を使った方法は名刺管理だけでなく、他の分類作業にも役立ちそうですね。

弊社では、Google Apps Script(GAS)を活用した業務効率化のサポートを提供しております。
GASのカスタマイズやエラー対応にお困りの際は、ぜひお気軽にご相談ください。
また、ITツールの導入支援やIT導入補助金の申請サポートも行っております。
貴方の業務改善を全力でサポートいたします。





	








コメント