Notion DataBaseにGoogle Formからレコードを追加してみた

2022.11.24

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

NotionのDataBaseを編集する際にうっかり空行追加することが度々ありました。ソート等で追加したばかりの空行自体が見えなくなることもあり、何か対処を取りたいと思いましたがNotionの標準機能のみではどうにもし難い状況です。

Formで受け付けた情報をDataBaseに投稿することでレコードの誤追加もなくせるのではと思い、Google Form経由で試してみました。

Google FormからNotion DataBaseにレコードを追加する

通しでの動作完了に至るまでAPIの仕様を読み解くところから動作検証を行いましたが、かなりの時間を食いました。主にAPIドキュメントが原因です。諸々は後の段落で記載します。

var database_id = 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'

function onSubmit(e) {
  const questions = e.response.getGradableItemResponses();
  var data = {
    'parent': {'database_id': database_id},
    'properties': {}
  }
  for (const question of questions) {
    const answer = question.getResponse();
    var title = question.getItem().getTitle()
    switch(title) {
      case "タイトル":
        data['properties'][title] = {
          "type": "title",
          'title': [{"type": "text", "text": {'content': answer}}]
        }
        break;
      case "テキスト":
        var param = []
        answer.forEach(function(e) {
          param.push({ 'name': e })
        })
        data['properties'][title] = {'multi_select': param }
        break;
      case "列1":
        data['properties'][title] = {'rich_text': [
          {
            'type': "text",
            'text': {'content': answer} 
          }
        ]}
        break;
    }
  }
  console.log(data)
  var result = sendRequest('https://api.notion.com/v1/pages', 'POST', data)
  console.log(result)
}

const token = 'secret_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'

function sendRequest(url, method, data=null) {
  let headers = {
    'content-type' : 'application/json',
    'Authorization': 'Bearer ' + token,
    'Notion-Version': '2022-06-28',
    'accept': 'application/json'
  };
  var options ={
    'method': method,
    'headers': headers,
    "muteHttpExceptions" : true,
  }
  if (data) {
    options['payload'] = JSON.stringify(data)
  }

  let notion_data = UrlFetchApp.fetch(url, options);

  notion_data = JSON.parse(notion_data);
  return notion_data;
}

GAS側でトリガー設定が必要です。

後はフォームとNotion DataBase上の項目名をあわせるだけ。Notion DataBaseはAPIに各カラムのIDを強制では求めません。

Notion DataBaseにレコードを追加する際の注意点

Notion APIの仕様が非常に難解であることも原因と言えますが、StackOverFlowやRedditでもNotion DataBaseにAPI経由で情報を追加しようとしてCould not find database with IDというエラーに振り回されているケースを多く見かけます。幾つか見かけた検討要素としては以下の通り。

  • インラインDBではなくフルページDBを使うべき
  • APIのバージョンを下げよう
  • 公開権限にしよう

最後の公開権限にするのは事故の発生が軽く予想できるので無しとして、実はこの辺りは全く関係ありませんでした。必要な要素は以下の通り。

  • 編集権限付きのコネクトを行う
  • APIはhttps://api.notion.com/v1/pagesを用いる。
  • メソッドはPOST。
  • Notion Versionは最新で。
  • JSONの引数にてparentには { 'database_id' : 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX' }を指定。ブラウザURL欄のIDを8桁-4桁-4桁-4桁-12桁 構成で書き直したもので、ハイフンを省いても処理は変わりません。

上手くいかない原因はほぼほぼ利用しているAPIを間違えているの一点につきます。NotionのAPIとそれらが扱うDB及びページの要素について図解が全く存在しないのも分かりづらくなっている原因といえます。この辺りは検証をもってわかってきたのでいずれ図にしてみようと思います。

あとがき

Notion DataBaseには各項目毎の解説がとても書きにくいのですが、Google Formにて項目毎の説明を付与することで解消できます。またNotion側でロックを掛けていてもAPI経由では問題なく追加できるため、うっかり空行追加も回避できます。GAS側の実装もシンプルなので、NotionDataBaseの入力バリデーションで困っている場合にはおすすめです。