Google フォームの編集がやや面倒になり、もうちょっと楽できないかなと考えていました。ふとNotionのDataBaseにおける各種プロパティがフォームと似たもの多めだと気が付き、DataBaseを元にフォームを作成してみることにしました。
DataBaseの設計
テキスト関係であれば特になんでも構いません。関数やリレーションに関するフィールドは使い物にならないはずです。
GAS上でDataBaseを読み込む
多く見受けられるサンプルコードと特に変わった場所はないはずです。
let pageId = "XXXXXXXXXXXXXXXXXXX"
const token = 'secret_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXx'
function getDatabaseStatus() {
var data = sendRequest('https://api.notion.com/v1/databases/' + pageId, 'GET')
Logger.log(data)
}
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;
}
DataBaseプロパティを元にフォームを組み立てる
即興でやったため、getDataBaseStatus
に混ぜました。連想配列の入れ子になっているため、Loggerで確認しながら組むほうが無難です。
function getDatabaseStatus() {
var data = sendRequest('https://api.notion.com/v1/databases/' + pageId, 'GET')
Logger.log(data)
var form = FormApp.create("Input Form")
Object.keys(data).forEach( function(key) {
Logger.log(key)
if (key == 'properties') {
Logger.log(data[key])
Object.keys(data[key]).forEach( function(field) {
Logger.log(field)
if (data[key][field]['type'] == 'title' || data[key][field]['type'] == 'url') {
form.addTextItem().setTitle(data[key]['name'])
} else if (data[key][field]['type'] == 'rich_text') {
form.addParagraphTextItem().setTitle(data[key]['name'])
} else if (data[key][field]['type'] == 'multi_select') {
var values = [];
data[key][field]['multi_select']['options'].forEach(function(option) {
values.push(option['name'])
})
form.addCheckboxItem().setTitle(data[key]['name']).setChoiceValues(values)
}
})
}
})
Logger.log(form.getEditUrl())
}
実行結果は以下の通り。今回はDataBaseのプロパティで入力できる値を全て許容しましたが、値の絞り込み済みレコードを幾つか用意し、Queryにて指定したレコードを元に値を変えたフォームを作成することも可能です。
問題点は今回のコードでは生成するフォームIDを一切指定していないので、毎回新しいフォームが作成されるところでしょうか。
あとがき
とりあえずざっくりとやってみました。フォームから送信した内容をDBに取り込むという派生もありますが、今回はまずはスプレッドシートへの入力としておきます。