【Notion API × GAS】タスクを自動追加したい!#2 GASで使用するサブ関数作成
こんにちは、おしょうです。
さて、前回はTodoリストのテンプレートを作成しました。
今回からいよいよ、GASを組んでいきます!
前回言い忘れていましたが、プログラムの全体像は、
1. Googleスプレッドシートに、タスク等必要な情報を入力する
2. 1のGoogleスプレッドシートにGASを走らせる。以下が処理される。
3. スプレッドシート上のタスクのリストをNotionに投入
4. 前週の未完了分タスク(日課を除く)を抽出してNotionに投入
というものにしていこうと思います。
今回は、全体のプログラムを組み上げるより先に、プログラムの部品のサブ関数をいくつか作っていきたいと思います。
例えば、データベースに実際に新規レコード(項目)を追加する関数や、データベースの未完了分のタスクを抽出する関数、URLからデータベースIDのみを切り出す関数ですね。
それでは、いってみましょう!
1. URLからデータベースIDを切り出す関数
データベースのURLのコピーの仕方はこちら。
Notionの部品のURLは、以下の構成のようです。
https://www.notion.so/{データベースのID}?v={謎の文字列}
謎の文字列・・・ほんとすみません。笑
v以降のパラメータ、NotionAPI本家調べればわかるんでしょうけれど、今回使わないし、誰かどこかで説明してくれてるんじゃないかな〜って。。。いやほんとズボラですみません。
それから、構成が分かったし正規表現でやったらスマートにいけそう!と思ったんですが、正規表現が全然分からず。。。詳しい方いらっしゃれば、ぜひそのやり方をコメントでご教授いただけると大変有り難いです。とりあえず、splitメソッドにより切り出しに成功しましたので、よかったら参考にお願いします。
function getId(url){
let str1 = url.split("?")[0]
// str1は、?で分割して、その最初の文字列
let str2 = str1.split("/")
// str2は、/で分割したものの配列
let result = str2[str2.length-1]
// 配列str2の最後のアイテムがデータベースID
return result
}
2. 新規レコード情報をJSONにする関数
APIで送信するレコード情報を格納するJSONが長いので、JSONを簡単に作る関数を作成します。
これを参考にしていただければ、今後のカスタマイズもしやすいのではないかと思います。JSONの細かい仕様はNotionAPI本家を見てみてください。
function createRecord({id,task_name,day="",tags="",expectedTime="",takenTime="",due=""}){
let result = {
"parent" : {
"database_id" : id,
//ここにデータベースIDが入ります。
},
"properties" : {
// "properties"の中に、それぞれの項目を入れていきます。項目名>①type ②typeごとの詳細
"Done" : {
"type" : "checkbox",
"checkbox" : false,
},
"タスク" : {
"title" : [
{
"type" : "text",
"text" : {
"content" : task_name,
}
}
]
},
}
}
return result
}
複数の引数を省略可能にするため、引数をオブジェクトにしています。
上記は、関数呼び出し時に必要な引数だけ(データベースID、チェックボックス、タスク名)を処理しました。省略可能な引数の処理も追加していきます。以下の文言を、先ほどの関数の「return result」の前に挿入します。
if(day != ""){
result.properties["曜日"] = {
"select" : {
"name" : day,
}
}
}
if(tags != ""){
let items = []
for(let i in tags){
let item = {
"name" : tags[i]
}
items.push(item)
}
result.properties["種類"] = {
"multi_select" : items
}
// ※Notionのデータベース上に追加されていない種類を入れてしまうと、HTTPエラーが返ってくるようです
}
if(expectedTime != ""){
result.properties["予定"] = {
"number" : expectedTime
}
}
if(takenTime != ""){
result.properties["最終"] = {
"number" : takenTime
}
}
if(due != ""){
result.properties["期限"] = {
"date" : {
"start" : due
}
}
}
それで、実際に使う時はこんな感じです。
let record = {
"id" : データベースのID,
"task_name" : "筋トレ",
}
let result = createRecord(record)
3. APIを使って新規レコードを追加する関数
次に、それをもとにAPIを叩く関数です。
function addRecord(json_record){
const ENDPOINT = "https://api.notion.com/v1/pages/"
const SECRET_KEY = "自分のInternal Integration Token"
const HEADERS = {
"Authorization" : `Bearer ${SECRET_KEY}`,
"Notion-Version" : "2021-05-13",
}
let options = {
method : "POST",
contentType : "application/json",
headers : HEADERS,
payload : JSON.stringify(json_record)
}
UrlFetchApp.fetch(ENDPOINT,options)
}
引数には、レコード情報を格納したJSONデータを入れます。
SECRET_KEYには、ご自分の Notion APIトークンに変換しておいてくださいね。
4. データベースから特定の項目を抽出する関数
"filter"というキーのJSONデータをPOSTすることで、特定の項目のみ抽出されたレコードがJSONで返ってきます。
今回は、前週分のデータベースで「"Done"が☑︎でない」かつ「"日課"という種類を含まない」という条件でフィルターを作成し、POSTします。
function getIncompleteTasks(databaseID){
const ENDPOINT = "https://api.notion.com/v1/databases/" + databaseID + "/query"
const SECRET_KEY = "自分のInternal Integration Token"
const HEADERS = {
"Authorization" : `Bearer ${SECRET_KEY}`,
"Notion-Version" : "2021-05-13",
}
let filter = {
"filter" : {
"and" : [
{
"property" : "Done",
"checkbox" : {
"does_not_equal" : true
}
},
{
"property" : "種類",
"multi_select" : {
"does_not_contain" : "日課"
}
}
]
}
}
let options = {
method : "POST",
contentType : "application/json",
headers : HEADERS,
payload : JSON.stringify(filter)
}
let result = UrlFetchApp.fetch(ENDPOINT,options)
return JSON.parse(result)
}
5. まとめ
ここまで、いくつかサブ関数を作成してきました。
次回はGoogleスプレッドシートの準備をして、GASを埋め込んでいきたいと思います。