![見出し画像](https://assets.st-note.com/production/uploads/images/128229109/rectangle_large_type_2_a4fdf24bc8bbaccaf05195cfbdd534cc.png?width=1200)
GPTsのActionsでGoogle Apps Scriptを使ってNotionに登録する
1. 目的
Notionで管理している家計簿への入力を自動化することが目的です。レシート画像を渡すだけであとはChatGPTに入力をやってもらいたいと思って初めて作ったのが、Receipt WizardというGPTです。
![](https://assets.st-note.com/img/1705739512391-Nv5lcDuBdb.png)
2. やったこと
はじめて作ったときは全くActionsの使い方が理解できなかったのでとりあえずググって下記の記事を見つけました。
非エンジニアなので細かいところまで理解できませんが、GASで書いたスクリプトの動かし方をGPT側にOpenAPIのSchemaで伝えてあげることで、GPTがGASを動かせるようにするということだと思います。
2.1. Google Apps Script作成
GASもOpenAPIもさっぱりわかりませんので、ChatGPTと作りました。ChatGPTは様々なAPIに精通しているので「NotionAPIを使ってPageを生成するGoogle Apps Scriptを書いて」とか適当なこと言いながら詳細を詰めていって下記のコードを書き上げました。
function doGet(e) {
var notionApiKey = 'YOUR_API_KEY'; // ここにNotionのAPIキーを入力
var databaseId = 'YOUR_DB_ID'; // ここにデータベースIDを入力
console.log("e: " + JSON.stringify(e));
var Shop_name = e.parameter.shop_name;
var Sum = Number(e.parameter.sum);
var Date = e.parameter.date;
var Category = e.parameter.category;
var User = e.parameter.user;
var Split_Date = Date.split('-');
var Month = Split_Date[1];
console.log(Month);
// 12種類のページID
var pageIds = {
'01' : '',
'02' : '',
'03' : '',
'04' : '',
'05' : '',
'06' : '',
'07' : '',
'08' : '',
'09' : '',
'10': '',
'11': '',
'12': ''
};
var categories = {
'食料品' : '',
'外食' : '',
'日用品' : '',
'衣服' : '',
'本' : '',
'家電' : ''
}
var headers = {
'Authorization': 'Bearer ' + notionApiKey,
'Content-Type': 'application/json',
'Notion-Version': '2022-06-28'
};
var payload = {
'parent': { 'database_id': databaseId },
'properties': {
'支出': {
'title': [
{
'text': {
'content': Shop_name
}
}
]
},
'値段': {
'number': Sum
},
'日付': {
'date': {
'start': Date
}
},
// ここに関連ページのrelation属性を追加
'月': {
'relation': [
{
'id': pageIds[Month]
}
]
},
'カテゴリ': {
'relation': [
{
'id': categories[Category]
}
]
},
'user': {
'select': {
'name': User
}
}
}
};
var options = {
'method': 'post',
'headers': headers,
'muteHttpExceptions' : false,
'payload': JSON.stringify(payload)
};
var response = UrlFetchApp.fetch('https://api.notion.com/v1/pages', options);
console.log(response.getContentText());
return response;
}
ちなみに家計簿のデータは下のようなフォーマットです。
![](https://assets.st-note.com/img/1705741296274-2Svp65D4CZ.png)
月やカテゴリをリレーションで実現しているのでそこがちょっと難しかったです。1~12の数字に対応したページのIDとカテゴリに対応したページのIDを持っておく必要がありました。
2.2. OpenAPIのSchema作成
openapi: 3.1.0
info:
title: Register household accounts data
description: Register household accounts data
version: v1.0.0
servers:
- url: https://script.google.com
paths:
/macros/s/***********************/exec:
get:
description: Create Notion Page
operationId: CreatePage
parameters:
- name: shop_name
in: query
description: Name of shop
required: true
schema:
type: string
- name: date
in: query
description: Date of receipt
required: true
schema:
type: string
example: 2000-01-01
- name: sum
in: query
description: sum of the receipt
required: true
schema:
type: integer
example: "1000"
- name: category
in: query
description: category of the receipt
required: true
schema:
type: string
example: 食料品
- name: user
in: query
description: buyer of the receipt
required: true
schema:
type: string
example: 共用
deprecated: false
意味が分かっていないのでおかしな記述になっているかもしれませんがとりあえず動いています。GAS側でe.parameterで参照できる値がこのschemaで書かれているparametersのnameと一致するようにすれば良いという程度の理解です。
2.3 GPTの調教
ここまできたらあとはGPTを躾けるだけです。Instructionに下記のような内容を書いています。
「レシートウィザード」は、日本語を話すユーザー向けに設計されており、レシートの画像から必要な情報を抽出してNotionの家計簿に登録することを目的としています。
レシート画像から店名、日付、合計金額、購入カテゴリーの情報を抽出します。カテゴリーはパラメータ.txtを参照してください。
ユーザーは、レシートを登録する人の選択肢はパラメータ.txtを参照。デフォルトで「共用」を提案します。
ウィザードはレシート上の日付が常に「YYYY-MM-DD」という形式で記録されるようにします。
日付が不明確な場合、再提出を求めたり、現在の日付を使用することを提案します。
情報を抽出した後、Notionへの提出前に登録予定の内容を確認のために表示します。
登録後、「The script completed but the returned value is not a supported return type.」というレスポンスが
来た場合、Notionへの登録が成功したと判定して、ユーザーにも成功したとだけ伝えて下さい。
最後の登録後のレスポンスの指示は、毎回Notionに家計簿データを登録した後に「予期せぬ返答があったので登録が成功したかわからない」と長々報告してきてうんざりしたので書き加えたものです。OpenAPIでちゃんとレスポンスを定義するか、GAS側で適切な戻り値を作り込めばよいのかもしれないですがそこはGPTの賢さに甘えました。これができるのが良いところだと思います。
3. 実際どんな感じか
![](https://assets.st-note.com/img/1705742935804-52MEzT1s7U.png)
というわけでレシート画像をアップロードするとその画像から必要な情報を読み取ってNotionに登録してくれるGPTが完成しました。画像からの情報読み取りなどは何も工夫していなくて無茶ぶりしているだけですがちゃんと動いてくれて有難い限りです。