【Google AppSheet備忘録】Automation編2:AppSheet × Gemini APIで画像認識

AppSheet

Google AppSheetでアップロードされた画像(レシートや花の写真など)を、Googleの生成AI「Gemini API」で解析し、認識結果をアプリに反映する仕組みを作ったときの備忘録です。
このページでは、Apps Scriptのコードと、Google AppSheet側のAutomation(Bot)の設定を中心に記録しています。

スポンサーリンク

この記事でやること

  • AppSheetで画像をアップロード
  • Apps Scriptで画像をbase64化し、Gemini APIに送信
  • 画像の内容(例:レシート内容花の名前など)をAIで判定
  • 認識結果をAppSheetに自動反映

使ったもの

構成役割
AppSheet画像アップロードBot実行
Google Drive画像保存
Google Apps Script画像のbase64変換Gemini API連携
Gemini API(Google AI Studio)画像認識・説明生成

Apps Scriptのコード

Drive上の画像ファイルを取得し、base64エンコードしてGemini APIに送信。認識結果を返す関数です。

function imageGeminiAPI(prompt, fileName) {
  const file = DriveApp.getFilesByName(fileName).next();
  const blob = file.getBlob();
  const imageData = Utilities.base64Encode(blob.getBytes());

  const apikey = PropertiesService.getScriptProperties().getProperty("GEMINI_API_KEY"); 
  const MODEL = "gemini-2.0-flash";
  const url = `https://generativelanguage.googleapis.com/v1beta/models/${MODEL}:generateContent?key=${apikey}`;

  const mimeType = blob.getContentType();
  const objHeaders = {
    'Content-Type': 'application/json'
  };

  const objPayload = {
    "contents": [{
      "parts": [
        {"text": prompt},
        {
          "inlineData": {
            "mime_type": mimeType,
            "data": imageData
          }
        }
      ]
    }]
  };

  const objOptions = {
    method: 'post',
    headers: objHeaders,
    payload: JSON.stringify(objPayload)
  };

  const response = UrlFetchApp.fetch(url, objOptions);
  const json = JSON.parse(response.getContentText());

  console.log(json.candidates[0].content.parts[0].text);
  return json.candidates[0].content.parts[0].text;
}

ポイント

  • 画像ファイル名はAppSheetから別列で渡す必要あり(URLではNG)
  • base64Encode で画像をGemini APIが理解できる形式に変換
  • プロンプトは「この画像に写っているものを説明してください」などがおすすめ

AppSheet側の設定

設定方法は以下と同じです。

この記事ではまったこと

画像URLではエラーになる

AppSheetの画像列はURLだが、Gemini APIにはbase64形式のバイナリ画像が必要。
そのため、Driveのファイル名取得→Blob化→base64変換という処理が必須。

実行ログの出力は必須

処理の進行状況やエラーの原因を追うには、ログ出力が不可欠。Logger.log()console.log()を適宜入れる。

// 実行ログの例
Logger.log("取得した画像名:" + fileName);
Logger.log("APIレスポンス:" + json.candidates[0].content.parts[0].text);

その他注意点

  • Driveに同名ファイルがあると、最初の1件だけが取得される
  • 画像ファイルが非公開設定だと取得エラーになる場合あり
  • APIキーはスクリプトプロパティ(GEMINI_API_KEY)に保存して管理

メモ

この記事では、画像アップロード→Geminiで認識→結果保存の一連の流れを実装しました。
アプリとしての完成形(例:花アプリやレシートアプリなど)は、以下書籍で出版中です。

導入手順も詳しく書いていますのでぜひ手に取って見てください。

コメント

タイトルとURLをコピーしました