LoginSignup
2
0

More than 5 years have passed since last update.

Scrapboxで選択した範囲をTodoistに追加

Posted at

概要

Scrapboxで書き散らした内容を片っ端からTodoistにタスクとして追加していくためのプログラム。なお、本手法はTodoistTokenをUserScriptに記載する必要があるため、クローズドなプロジェクトかつ、信頼できる場所で利用するのが望ましい。
実装にはGoogleAppsScriptとScrapboxのUserScriptを利用する。

下準備

本記事で説明するコードは事前に以下の準備が必要である。本記事での説明は省略する。

実装

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で期限や登録するプロジェクトや期限、優先度などを変更できる。片っ端から放り込むという割にはポップアップが多少うざったいかもしれない。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0