概要
Scrapboxで書き散らした内容を片っ端からTodoistにタスクとして追加していくためのプログラム。なお、本手法はTodoistTokenをUserScriptに記載する必要があるため、クローズドなプロジェクトかつ、信頼できる場所で利用するのが望ましい。
実装にはGoogleAppsScriptとScrapboxのUserScriptを利用する。
下準備
本記事で説明するコードは事前に以下の準備が必要である。本記事での説明は省略する。
- Incoming WebHooksの設定
- Outgoing Webhooksの設定
- Todoist tokenの取得
- Todoistの[設定]>[連携機能]>[APIトークン]
- GoogleAppsScriptをWebアプリケーションとして導入
実装
GAS側のコードを以下に示す。
function doGet(e) {
var params = e.parameter;
var url = "https://todoist.com/API/v7/sync",
uuid = Utilities.getUuid(),
tempId = Utilities.getUuid(),formData, response;
if(e.parameter==undefined){
Logger.log("error");
}else{
var token=params.token;
var projectId = searchProject(params.projectName,token),
formData = {
"token": token,
"commands":
JSON.stringify([{
"type": "item_add",
"temp_id": tempId,
"uuid": uuid,
"args": {
"priority" : params.priority,
"content": ""+decodeURIComponent(params.text),
"project_id": projectId,
"due": {
"string": params.limit,
},
}
}])
};
response = UrlFetchApp.fetch(url, {
"method" : "post",
"payload" : formData
});
return response.getResponseCode();
}
}
function searchProject(projectName,token){
var projectName="test",
url = "https://todoist.com/API/v7/sync",
formData,options,response;
var headers = {
"Accept": "application/json",
};
formData ={
"token": token,
"sync_token":"*",
"resource_types":'["projects"]',
};
response = UrlFetchApp.fetch(url,{
"contentType": "application/json",
"headers":headers,
"method":"post",
"payload":JSON.stringify(formData)
});
var array = JSON.parse(response.getContentText());
for(var i = 0; i < array["projects"].length; i++){
if(array["projects"][i]["name"]===projectName){
return array["projects"][i]["id"];
}
}
return 000000;
}
Scrapbox側のコードを以下に示す。tokenとGASで発行したウェブアプリケーションをコード内の該当箇所に入力する必要がある。
scrapbox.PopupMenu.addButton({
title:'Todo',
onClick: text =>{
const lines = text
.split(/[\r\n]/)
.map(line => line.replace(/[\[\]]/g, '').replace(/^\s+/, ''))
const param = {
'text': lines,
'priority':1,
'limit':'',
'projectName':'',
'token':"<<自分のTodoistToken>>",
}
console.log(lines)
const query = Object.keys(param)
.map(key => `${key}=${encodeURIComponent(param[key])}`)
.join('&')
const url = `<<GASで発行したウェブアプリケーションURL>>?${query}`
window.open(url)
}
})
雑記
ScrapboxのUserScriptで期限や登録するプロジェクトや期限、優先度などを変更できる。片っ端から放り込むという割にはポップアップが多少うざったいかもしれない。