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側の設定
設定方法は以下と同じです。

【Google AppSheet備忘録】Automation編1:AppSheet × Gemini APIでテキスト生成
AppSheetのBot(Automation)を使って、ユーザーの入力をGoogleの生成AI「Gemini API」に送信し、返ってきた文章をアプリに反映させる仕組みを作った…
この記事ではまったこと
画像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で認識→結果保存の一連の流れを実装しました。
アプリとしての完成形(例:花アプリやレシートアプリなど)は、以下書籍で出版中です。
導入手順も詳しく書いていますのでぜひ手に取って見てください。
リンク
コメント