見出し画像

GPTsのActionsでGoogle Apps Scriptを使ってNotionに登録する


1. 目的

Notionで管理している家計簿への入力を自動化することが目的です。レシート画像を渡すだけであとはChatGPTに入力をやってもらいたいと思って初めて作ったのが、Receipt WizardというGPTです。

魔法使いのひげがレシートになっている素敵なデザイン

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;
}

ちなみに家計簿のデータは下のようなフォーマットです。

Notionの家計簿

月やカテゴリをリレーションで実現しているのでそこがちょっと難しかったです。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. 実際どんな感じか

レシート画像をアップロードしたところ

というわけでレシート画像をアップロードするとその画像から必要な情報を読み取ってNotionに登録してくれるGPTが完成しました。画像からの情報読み取りなどは何も工夫していなくて無茶ぶりしているだけですがちゃんと動いてくれて有難い限りです。

この記事が参加している募集

GPTsつくってみた

この記事が気に入ったらサポートをしてみませんか?