見出し画像

BookNotionが羨ましかったのでAndroid版をTaskerで作った話

こんにちは。

みなさん、BookNotion、ご存知ですか?
kindleのハイライトやメモをnotionに残せる便利アプリです。以前からハイライトの同期は有料サービスはあったりしましたが、無料で日本語で…最高じゃねーか…と思っていました。

そう…Android版がない、ということに気付くまで……。

…………

……

昔からカスタマイズ性がAndroidの領分だったろ!?
思い出せあの頃の気持ち…
ないなら………作れ!!

ということで作りました。
Taskerで!!!

動画の挙動を見て貰えばわかると思いますが、エンジニアでもない適当デザイナーの素人制作なので、割とゴリ押し制作です。甘く見てくれ…。


Taskerとは?

日本円だと380円くらいだったと思う

昔からずっと愛されているアプリなので知ってる方もいるかもしれません。スマホの色々を自動化してくれる最高のアプリです。
自分のアイディア次第でいろんなことができますが、世の中的によく使われるのは下記あたりでしょうか

  • 家に帰るとwi-fiをオンにする

  • 特定の場所では自動でマナーモードにする

  • 会社を出たら家族に帰宅のメッセージを送る

最近私が作った簡単なところで言うと、
外にいる場合のゲームアプリ起動時ゲーム名(会社名)読み上げ爆が怖いので、特定アプリ起動時に、自宅内もしくはイヤフォンが接続されている時以外は音量をミュートにする、と言うのを作りました。これで外出時も怖くない。

使い勝手は今で言うとローコードツールですね。
有料アプリではありますが、買い切り380円なので、良心的な価格だと思います。
アプリ自体のUIが全然好きじゃないですが、便利なので相殺ですわ。

使い方など詳しいことは下記などを読んでください。


作り方

必要なもの

  • Tasker(有料380円)

  • AutoTools(有料200円…くらい?)
    Taskerのプラグインです。
    TaskerそのままだとREST APIからJSONを読む?ためには別途設定が必要?らしいのですが、これがあると解決らしいです。詳しいことはよくわかりません。
    RESTask for Tasker(無料)でもいいらしい。
    (私は別制作時にAutotools持ってたのでそのまま説明します…)

  • notion インテグレーション
    トークン、データベースIDなど情報を適宜集めましょう。
    トークンはここから取得してください。よくわからない方は調べてね。

  • Side bar screen Swiftly Switch
    サブランチャーアプリです。Twitterの動画だと右下に丸く出てくるアレです。今回はタスクのトリガー設定をせず、手動でタスク実行させるので、あった方がいい。他の使ってるならそっちでもいいと思います。
    有料もあるけど無料で充分かなー

Swiftly Switchの画面。これも便利で大好きなアプリです。


方針

  • 1つ1つをシェアするのはめんどくさいしすぐ上限にいくので、読み終わったら最後1回だけ実行する

    • メモとハイライトのページを使用する

  • メモはKindle内のメモを使って、転記する形

  • 引用DBと読書記録DBはリレーションさせる

  • タスクは2つ

    • 読書記録DBに本を記録して、メモとハイライトのページに飛ばす

    • ページ内容を取得してハイライトを分解し引用DBに保存していく

メモとハイライトの画面

実際の運用時

  1. ハイライトをしながら本読み終わった!

  2. ★この本の情報>シェアする>その他>コピー

  3. ★Swiftly Switch(サブランチャー)からタスク1実行

  4. 設定した内容を記入したり(本の簡易感想とか、本の種類とか。内容はご自由に。なくてもいい。)

  5. 記録を実行すると読書記録DBに記録が入り、メモとハイライトのページに自動で飛ばされる

  6. ★本が表示される。大体、ハイライトつけた順になってるので大体は一番上の該当の本をタップ

  7. ハイライトが表示されるので、もし追加でメモしたいことな度あれば追加でメモしたりもここでできる(しなくてもいい)

  8. ★Swiftly Switch(サブランチャー)からタスク2実行

  9. 引用DBに記録が入る。完了!

実際にマストで自分がやらなきゃいけないのは★のやつのみ。
TaskerにはAutoInputと言うプラグインもあり、座標を指定してタップしてくれるのがあるので、それを使って2を省略するのもありだな〜とちょっと思っています。
実際のデモは上にも貼ったけどツイートについてる動画を見てね。

長〜い 賢い人がやったらもうちょっと短くなるのかもしれん。
あと、↑の画像、ほんのちょっとだけ下で解説してるのと設定が違うところがありますすみません


ひとつ目のタスク

手順1:タスクを制作

タスクタブから+を押して、[鑑賞記録ログ]と言う名前のタスクを作ります。名前はなんでもいいです。
最初は何もないですが、コレから下の+を押してどんどんアクションを制作していきます。

手順2:シェアからコピーした内容からタイトルを取得する

コピーした内容はこういうものになってます。
ここから正規表現などを使って各種情報を取り出していきます。

あなたもこの本が気に入るかもしれません。"ゆたかな人生が始まる シンプルリスト (講談社+α文庫)"(ドミニック・ローホー, 笹根由恵 著)

こちらから無料で読み始められます: https://a.co/dtvYZlG

kindleのシェア機能からコピーした内容

まず本のタイトルは""で囲まれているので、コレを指定して取り出して(A1)書籍名を変数%booktitleに入れておきます(A2)。
指定したものの直後/直前にある文字をマッチさせるのは、正規表現の先読み/後読みを使います。
正規表現わからない方は、notionではフォーミュラでも使えるものもあるので、コレを機に齧ってみるのもいいかもしれませんね。

最後のA3は、全角のスペースを半角スペースに変換するアクションです。
別箇所で%booktitleを使う際に、コピーした内容を使おうとするとなぜかスペースが半角になってしまい不都合があったのでここで処理しています。

    A1: Simple Match/Regex [
         種類: 正規表現
         文字: %CLIP
         正規表現: (?<=")[^"]+ ]
    
    A2: 変数を設定 / Variable Set [
         名前: %booktitle
         これに: %mt_match
         四捨五入する桁: 3
         Structure Output (JSON, etc): オン ]
    
    A3: 変数内を検索・置換 / Variable Search Replace [
         変数: %booktitle
         検索 / Search:  
         一致を置換する: オン
         置換先:   ]

このA1とかA2とか何〜〜!?って感じかもしれませんが、これひとつひとつがアクションの説明になってます。

+を押すとこの画面が出てくるので、↑の「A1:」の後にと書いてあるところの名前を画面下部の絞り込みに入れると出てくるのをタップ。全部入れなくても検索されます。今回だと「Simple Match/Regex」なのでregとでも入れると見つかると思います。

ひとつひとつこうやってアクションを設定していきます。その詳細は基本的には全部上の黒いとこに書いてある通り設定していきます。

手順2:著者名を取り出す

    A4: Simple Match/Regex [
         種類: 正規表現
         文字: %CLIP
         正規表現: (?<="()[^著)]+ ]
    
    A5: 変数を設定 / Variable Set [
         名前: %bookwriter
         これに: %mt_match
         四捨五入する桁: 3
         Structure Output (JSON, etc): オン ]

著者名は"タイトル"後の(〜〜著)の形なので、「"(」から「著)」の間を取り出します。ただの()の間だけだと、タイトルに()が入ってるとそっちがマッチしてしまうかもしれないので細かめに設定します。

手順3:URLを取り出す

    A6: Simple Match/Regex [
         種類: 正規表現
         文字: %CLIP
         正規表現: (?<=https://).* ]
    
    A7: HTTP リクエスト / HTTP Request [
         方式: GET
         URL: http://ryouchi.usamimi.info/expandurl/index.php?callback=getOrgURL&url=https%3A//%mt_match
         制限時間 (秒): 30
         Structure Output (JSON, etc): オン ]
    
    A8: Simple Match/Regex [
         種類: 正規表現
         文字: %http_data
         正規表現: (?<=asin\=).*(?=\") ]
    
    A9: 変数を設定 / Variable Set [
         名前: %bookurl
         これに: https://www.amazon.co.jp/dp/%mt_match
         四捨五入する桁: 3
         Structure Output (JSON, etc): オン ]
    
    A10: 変数を設定 / Variable Set [
          名前: %Asin
          これに: %mt_match
          四捨五入する桁: 3
          Structure Output (JSON, etc): オン ]

シェアからコピーしたURLにアクセスするとこう言うページに飛ばされます。うーん違うんだよなあ…。商品ページがいいですよね。
しかもこのページこの「LEARN MORE」と「BUY ON AMAZON」どっちも商品ページに飛ばされて何?と言う感じ。

Amazon的にはアフィとか?何かの意味があるんだろうけどやだ…

なので、商品ページを取得します。
AmazonのURLは下記になってるとのこと

https://www.amazon.co.jp/dp/ASIN10桁

AmazonのURLは短縮できる Qiita

ASINはamazonの商品ごとに割り当てられてるIDみたいなものですね。
幸い、シェアからアクセスするこのページはURLが「https://read.amazon.com/kp/kshare?asin=B018K6C9UO&id=ほげほげ〜」となっておりASINが入っているので取り出せそうです。

ただ現状持ってるのはこのページへの短縮URLだけ。
なので、短縮URL先のURLを取得するAPIを使います。(A7)

特に設定などのいらないAPIなので、アクションはHTTPリクエスト、URLのところにだけ上記の内容を入れてください。
すると%http_dataに帰ってきたデータが入るので、ここからさらに正規表現でASINだけ取り出し(A8)、URLを作ります(A9)

また、このASINは別のところでも使うので、変数%Asinにセットしておきます(A10)

%AsinのAは大文字にしてください。
全て小文字の変数は、同一タスク内でのみ使用可能ですが、今回のような1つ以上大文字を含む変数は、グローバル変数と言って、Taskerのどこからでも参照可能な変数になります。

手順4:諸々記入欄を作る

感想を記入したり、本の種類タグ(漫画or小説or本)を入れるところです。
これは私の運用方法に沿って制作してあるので、必要あればでいいと思います。

    A11: List Dialog [
          モード: Multiple Choices
          タイトル: 種類を選んでね
          項目: 漫画,小説,本
          Button 1: 記録
          Button 2: 感想
          Button 3: ハイライト
          Close After (Seconds): 30
          First Visible Index: 0
          Hide Filter: オン ]
    
    <ボタンによって感想ダイアログ→プロパティをセット>
    A12: If [ %ld_button ~R 感想 | %ld_button ~ ハイライト ]
    
        A13: 入力ダイアログ / Input Dialog [
              タイトル: 簡易感想
              Close After (Seconds): 30
              入力方式: 655441
              入力内容を選択状態にしておく: オン ]
    
        A14: 変数を設定 / Variable Set [
              名前: %kanso
              これに: ,
             "簡易感想": { "rich_text": [ { "type": "text", "text": { "content": "%input" } } ] } 
              四捨五入する桁: 3
              Structure Output (JSON, etc): オン ]
            If  [ %input 値あり ]
    
        A15: 変数を設定 / Variable Set [
              名前: %kanso
              これに:  
              四捨五入する桁: 3
              Structure Output (JSON, etc): オン ]
            If  [ %input 値なし ]
    
    A16: Else
    
        A17: 変数を設定 / Variable Set [
              名前: %kanso
              これに:  
              四捨五入する桁: 3
              Structure Output (JSON, etc): オン ]
    
    A18: If の終わり / End If
    

A11はこう言うダイアログを出すものです。
ここで本の種類を選んでおくのと、下記に分岐させるようにしています。

  • ハイライトと感想を記録する

  • 感想を記録する

  • 本だけを記録する

分岐させるのがA12以降のif部分です。
A14は、notionに登録するときの準備です。感想を入れるプロパティがテキスト記入で、プロパティ名が"簡易感想"である場合です。

A14A15にはそれぞれにifがついています(各アクションの一番下の方にあるやつです)
これで感想欄が無記入でもエラーにならず先に進みます。

手順5:notion読書記録DBに記録する

    A19: HTTP リクエスト / HTTP Request [
          方式: POST
          URL: https://api.notion.com/v1/pages
          ヘッダー: Authorization: Bearer secret_*****APIトークン入れてね*****
         Notion-Version: 2022-02-22
         Content-type: application/json
          本文: { "parent": { "database_id":"***データベースDIを入れてね***" }, 
         "properties": {
         "タイトル": { "title": [ { "text": { "content": "%booktitle" } } ] },  
         "URL":{"url":"%bookurl"},
         "作者": { "rich_text": [ { "type": "text", "text": { "content": "%bookwriter" } } ] } ,
         "媒体":{"select":{"name":"%ld_selected()"}}
         %kanso
         } 
         }
          制限時間 (秒): 30
          どんな証明書も信頼する: オン
          Automatically Follow Redirects: オン
          Use Cookies: オン
          Structure Output (JSON, etc): オン
          エラーが起きても続ける:オン ]

ここは多少編集が必要です。API、データベースIDを取ってきた自分のものを入れてください。
また、「本文」と書いてある中にあるのがプロパティ内の設定です。記録したいデータベースの各プロパティ名も自分のものに変更してください。
ちょっとわかりにくいかもしれないですが、"媒体"とある部分は、先ほどA11のダイアログで取得した、本の種類タグ(漫画or小説or本)のことです。
不要なものは消してください。

手順6:完了の表示と、ハイライトページに飛ばす

   
    A20: 瞬間表示 / Flash [
          文字: 鑑賞ログに記録しました!
          すぐに次のタスクに進む: オン
          Dismiss On Click: オン ]
        If  [ %ld_button !~R ハイライト ]
    
    A21: If [ %ld_button ~R ハイライト ]
    
        A22: 瞬間表示 / Flash [
              文字: 鑑賞ログに記録しました!もうちょっとまってね。
              長く: オン
              すぐに次のタスクに進む: オン
              Dismiss On Click: オン ]
    
        A23: URL を開く / Browse URL [
              URL: https://read.amazon.co.jp/notebook ]
    
    A24: If の終わり / End If
    
    

ひとつ目のタスクはラストです。長いよ…😭
ダイアログでハイライトを選んでいればメモとハイライトに飛ばす
それ以外では完了の表示で終わり、と言う感じです。


疲れましたね。まだまだ3分の1くらいです。もうちょっと頑張りましょう


ふたつ目のタスク

ひとつ目のタスクが終わり、Taskerによってメモとハイライトのページへ飛ばされました。そこから本を選び、本のつけたハイライトやメモの一覧が表示されているページにいる状態です。

手順1:タスクを制作

ひとつ目と同じようにしてください。
名前はまあなんでもいいです。

手順2:「メモとハイライト」のページの情報を取得する

    A1: キーボード / Keyboard [
         入力: Control+A,Control+C
         入力間の時間: 500 ]
    
    A2: 変数を設定 / Variable Set [
         名前: %kaigyo
         これに: 
         
         四捨五入する桁: 3
         Structure Output (JSON, etc): オン ]
    
    <変数にクリップボードの内容を格納する>
    A3: 変数を設定 / Variable Set [
         名前: %copy
         これに: %CLIP
         四捨五入する桁: 3
         Structure Output (JSON, etc): オン ]

何にしても元になるデータが今はない状態なので、取ってきます。ここはもう少しいい方法があるのかもしれないですが…わからないので、力技でいきます!(脳筋)

Taskerにはキーボードと言う便利アクションがあるので、全て選択し、全てコピーするCtrl A、Ctrl Cを入れます(A1)
クリップボードの内容は特に設定しなくてもTaskerが変数を用意していて、%CLIPに入るようになっています。このまま使ってもいいのですが間違って途中コピーすることもあるかもしれんし一応新しい変数を用意してセットします(A3)

A2は後々使うものです。
私の設定方法が悪いのか、Taskerで改行の「\n」が使えない?っぽいので、改行だけを入れた変数を作っておきます。

手順3:メモを取得(前半)

こんな感じのものがコピーされています

どんどん正規表現で取り出して、変数に入れていきます。

が、その前にメモ(Note)のベースとなる部分を取得しておきます。
メモはある部分、無い部分があるのでそこら辺は後で整形するとして、ベースになる部分を%noteに入れておきます。

    <メモを取得>
    A4: 変数内を検索・置換 / Variable Search Replace [
         変数: %copy
         検索 / Search: ハイライト.*\s.*\s.*\s.*
         大小文字無視: オン
         複数行: オン
         一致箇所を保存する配列: %note ]


手順4:ハイライトカラー、位置、書籍名を取り出す

正規表現でどんどん取っていきます。

    
    <ハイライトカラーを取得>
    A5: 変数内を検索・置換 / Variable Search Replace [
         変数: %copy
         検索 / Search: .+(?=のハイライト)
         大小文字無視: オン
         複数行: オン
         一致箇所を保存する配列: %color ]
    
    <位置を取得>
    A6: 変数内を検索・置換 / Variable Search Replace [
         変数: %copy
         検索 / Search: (?<= 位置: ).*
         大小文字無視: オン
         複数行: オン
         一致箇所を保存する配列: %number ]
    
    <書籍名を取得>
    A7: Simple Match/Regex [
         種類: 正規表現
         文字: %copy
         正規表現: (?<=Your Kindle Notes For:\s).* ]

    A8: 変数を設定 / Variable Set [
         名前: %title
         これに: %mt_match
         四捨五入する桁: 3
         Structure Output (JSON, etc): オン ]

replaceとregexそれぞれで正規表現が使えるんですが、たまに片方ではいけるけど片方では使えないみたいなのもあってちょっとよくわかりません。


手順5:リレーション用のIDを取得する

    
    A9: 瞬間表示 / Flash [
         文字: 作業中です………
         すぐに次のタスクに進む: オン
         Dismiss On Click: オン ]
    
    <リレーション用idを取得>
    A10: HTTP リクエスト / HTTP Request [
          方式: POST
          URL: https://api.notion.com/v1/databases/**データベースIDを入れる**/query
          ヘッダー: Authorization: Bearer secret_**APIトークンを入れる**
         Notion-Version: 2022-02-22
         Content-type: application/json
          本文: {
           "filter": {
         "and":[
         {
         "property": "タイトル",
         "title": {
                   "contains" : "%title"}
         }]}}
          制限時間 (秒): 30
          Structure Output (JSON, etc): オン ]
    
    A11: Javascript (小) / JavaScriptlet [
          コード: var json = JSON.parse(http_data)
         var relationid = json["results"][0]["id"]
          自動で抜け出る: オン
          制限時間 (秒): 45 ]
    
    <鑑賞登録がされてない時、鑑賞DBに作る>
    A12: If [ %relationid 値なし ]
    
        A13: 待機 / Wait [
              ミリ秒: 0
              秒: 2
              分: 0
              時間: 0
              日: 0 ]
    
        A14: 瞬間表示 / Flash [
              文字: 鑑賞ログにないので、新しく登録します
              すぐに次のタスクに進む: オン
              Dismiss On Click: オン ]
    
        A15: HTTP リクエスト / HTTP Request [
              方式: POST
              URL: https://api.notion.com/v1/pages
              ヘッダー: Authorization: Bearer secret_**APIトークンを入れる**
             Notion-Version: 2022-02-22
             Content-type: application/json
              本文: { "parent": { "database_id":"**APIトークンを入れる**" }, 
             "properties": {
              "タイトル": { "title": [ { "text": { "content": "%title" } } ] },  
             "URL":{
             "url":"https://read.amazon.co.jp/notebook"}
             }
             }
              制限時間 (秒): 30
              Structure Output (JSON, etc): オン ]

        <リレーション用idを取得>
        A16: HTTP リクエスト / HTTP Request [
              方式: POST
              URL: https://api.notion.com/v1/databases/**データベースIDを入れる**/query
              ヘッダー: Authorization: Bearer secret_**APIトークンを入れる**
             Notion-Version: 2022-02-22
             Content-type: application/json
              本文: {
               "filter": {
             "and":[
             {
             "property": "タイトル",
             "title": {
                       "contains" : "%title"}
             }
             ]
             }
             }
              制限時間 (秒): 30
              Structure Output (JSON, etc): オン ]
    
        A17: Javascript (小) / JavaScriptlet [
              コード: var json = JSON.parse(http_data)
             var relationid = json["results"][0]["id"]
              自動で抜け出る: オン
              制限時間 (秒): 45 ]
    
    A18: If の終わり / End If

A9はスマホが静かだと作業してるかわかんないので気休め?に出してます。別にいらないです。

A10A11は読書DBのリレーション用にIDを探すアクション。
A12-15はIFで、もしリレーション用のIDがなければ新しいのを作る、と言うアクションです。URLとかが入らないので、あんまり使わない方がいいと思いますが、いざと言うとき用に設定してあります。

これも例にも漏れず、プロパティ名を変更するのを忘れないようにしてください!
あと今回出てきてるデータベースは読書DBのものですので、IDが引用DBのものと間違っていないかも気をつけてください。

手順6:引用部分を取得する

    <内容取得>
    A19: 変数内を検索・置換 / Variable Search Replace [
          変数: %copy
          検索 / Search: \A[\s\S]*? Highlight\(s\).*
          大小文字無視: オン
          一致を置換する: オン ]
    
    A20: 変数内を検索・置換 / Variable Search Replace [
          変数: %copy
          検索 / Search: .*のハイライト \| 位置: .*|.*Note:.*|.*                .*
          複数行: オン
          一致を置換する: オン ]
    
    A21: 変数内を検索・置換 / Variable Search Replace [
          変数: %copy
          検索 / Search: ^\s
          大小文字無視: オン
          複数行: オン
          一致を置換する: オン ]
    
    A22: 変数を分割 / Variable Split [
          名前: %copy
          区切り文字: %kaigyo ]

A19-21は先頭のタイトルを書いてる部分など不要な部分をを削除しています。
一致を置換すると言う部分をオンにして、「置換先」と言う項目には何も記入しないことで、マッチした部分が削除できます。

以上で綺麗に引用部分だけになった%copyを改行を区切りして配列にしていきます(A22)
配列については手順7で説明します。


手順7:URL、メモを整形+引用DBに登録する

   A23: 瞬間表示 / Flash [
          文字: notion登録作業開始します…
          すぐに次のタスクに進む: オン
          Dismiss On Click: オン ]

    <notionに投稿>
    A24: For [
          変数: %count
          項目: 1:%copy(#)
          Structure Output (JSON, etc): オン ]

     A25: 変数内を検索・置換 / Variable Search Replace [
              変数: %number(%count)
              検索 / Search: ,
              一致を置換する: オン
              エラーが起きても続ける:オン ]
    
        <urlを設定>
        A26: 変数を設定 / Variable Set [
              名前: %url
              これに: kindle://book?action=open&asin=%Asin&location=%number(%count)
              四捨五入する桁: 3
              Structure Output (JSON, etc): オン ]
    
        <メモ不要削除の整形>
        A27: 変数内を検索・置換 / Variable Search Replace [
              変数: %note(%count)
              検索 / Search: Note:|                |ハイライト.*\s.*
              大小文字無視: オン
              複数行: オン
              一致を置換する: オン ]
    
        A28: 変数内を検索・置換 / Variable Search Replace [
              変数: %note(%count)
              検索 / Search: %kaigyo
              一致を置換する: オン
              エラーが起きても続ける:オン ]
    
        A29: If [ %note(%count) ~R \# ]
    
            A30: 変数を設定 / Variable Set [
                  名前: %test
                  これに: 正規表現とおってるよ〜
                  四捨五入する桁: 3
                  Structure Output (JSON, etc): オン ]
    
            A31: 変数内を検索・置換 / Variable Search Replace [
                  変数: %note(%count)
                  検索 / Search: (?<=#)([^#]*)
                  一致箇所を保存する配列: %tagnakami ]
    
            A32: 変数を設定 / Variable Set [
                  名前: %tag
                  これに: "タグ":{"multi_select":[
                  四捨五入する桁: 3
                  Structure Output (JSON, etc): オン ]

    
            A33: For [
                  変数: %tagcount
                  項目: 1:%tagnakami(#)
                  Structure Output (JSON, etc): オン ]
    
                A34: 変数を設定 / Variable Set [
                      名前: %tagadd
                      これに: {"name": "%tagnakami(%tagcount)"}
                      四捨五入する桁: 3
                      Structure Output (JSON, etc): オン ]
                    If  [ %tagcount = 1 ]
    
                A35: 変数を設定 / Variable Set [
                      名前: %tagadd
                      これに: ,{"name": "%tagnakami(%tagcount)"}
                      四捨五入する桁: 3
                      Structure Output (JSON, etc): オン ]
                    If  [ %tagcount > 1 ]
    
                A36: 変数を設定 / Variable Set [
                      名前: %tag
                      これに: %tag%tagadd
                      四捨五入する桁: 3
                      Structure Output (JSON, etc): オン ]
    
                A37: 変数内を検索・置換 / Variable Search Replace [
                      変数: %note(%count)
                      検索 / Search: %tagnakami(%tagcount)|#
                      一致を置換する: オン ]
    
            A38: For の終わり / End For
    
            A39: 変数を設定 / Variable Set [
                  名前: %tag
                  これに: %tag]},
                  四捨五入する桁: 3
                  Structure Output (JSON, etc): オン ]
    
        A40: Else
    
            A41: 変数を設定 / Variable Set [
                  名前: %tag
                  これに:  
                  四捨五入する桁: 3
                  Structure Output (JSON, etc): オン ]
    
        A42: If の終わり / End If
    
        A43: 変数を設定 / Variable Set [
              名前: %note(%count)
              これに:  
              四捨五入する桁: 3
              Structure Output (JSON, etc): オン ]
            If  [ %note(%count) 値なし ]
    
        A44: HTTP リクエスト / HTTP Request [
              方式: POST
              URL: https://api.notion.com/v1/pages
              ヘッダー: Authorization: Bearer secret_**トークンを入れてね**
             Notion-Version: 2022-02-22
             Content-type: application/json
              本文: {"parent":{"database_id":"**引用DBのIDを入れてね**"},  
             "properties": { 
             "引用": { "title": [ { "text": {
             "content": "%copy(%count)" } } ] },
             "URL":{"url":"https://read.amazon.co.jp/notebook"}, 
             "ハイライトカラー":{"select":
             {"name":"%color(%count)"}},  
             %tag
             "メモ":{"rich_text": [{ 
             "type": "text",
             "text": { "content": "%note(%count)"},  
             "plain_text": "%note(%count)",     "href": null}
             ]}, 
             "位置":{"rich_text": [{
             "type": "text",
             "text":{"content":"%number(%count)"},
             "plain_text": "%number(%count)"}
             ]},  
             "URLスキーマ":{"rich_text": [{
             "type": "text",
             "text":{"content":"%url"},
             "plain_text": "%url"}
             ]},  
             "本":{"relation":[{"id":"%relationid"}]}
             }}
              制限時間 (秒): 30
              Structure Output (JSON, etc): オン ]
    
        A46: 待機 / Wait [
              ミリ秒: 0
              秒: 2
              分: 0
              時間: 0
              日: 0 ]
    
    A47: For の終わり / End For

    A48: 瞬間表示 / Flash [
          文字: 引用記録完了しました!
          長く: オン
          すぐに次のタスクに進む: オン
          Dismiss On Click: オン ]


ifが挟まり途中で切れず長〜〜〜〜いので、分割して説明していきます。

まず、ここまで取り出してきた各種ですが、配列という複数の値が入った変数になってます。

ハイライトカラーの例。1つ目は黄色、2つ目はピンク色、3つ目は〜という感じ

各データは変数名(数字)の形で取り出せます。↑の例でいうと、ハイライトカラーは%colorに入っているので、%color(1)は黄色、%color(2)はピンク色、です。

これを順番にnotionに投稿していくので、繰り返しのアクションである「For」を使っていきます。

    <notionに投稿>
    A24: For [
          変数: %count
          項目: 1:%copy(#)
          Structure Output (JSON, etc): オン ]

項目、というところが繰り返しの条件です。
これだと、1〜%copy(#)回数繰り返すってことで、その時の回数が%countに入ります
今何回目の繰り返しか→%count回目、ということです。
%copy(#)は、%copyに入ってる値の数のことです。引用の変数%copyが終わるまで繰り返しますっていうことですね。

他にも%copy()で配列全部、%copy(*)で配列最後の値を出す、だったり数字指定以外にも色々あるので気になったら調べてもいいかもしれないですね


手順7a:URL(スキーマ)を設定する

     A25: 変数内を検索・置換 / Variable Search Replace [
              変数: %number(%count)
              検索 / Search: ,
              一致を置換する: オン
              エラーが起きても続ける:オン ]
    
        <urlを設定>
        A26: 変数を設定 / Variable Set [
              名前: %url
              これに: kindle://book?action=open&asin=%Asin&location=%number(%count)
              四捨五入する桁: 3
              Structure Output (JSON, etc): オン ]

アプリを直接開くURLみたいなものがありまして、notionはURL判定してくれないのでリンクは貼れないんですがこれも作れるので一応設定しておきます。位置の指定もできるので、このURLスキームをコピーして直接アクセスすれば、kindleアプリの該当引用ページが開くようになっています。

AmazonキンドルアプリのURLスキームの構成は次のようになっています。

kindle://book?action=open&asin=xxxxxxxxxx&location=yyyy
asin:Amazonの商品識別番号(英数10桁)
location:本文の位置No.(数字)

URLスキームの挙動:書籍ASIN「xxxxxxxxxx」の本文「yyyy」の位置を表示する

【時短】AmazonキンドルのURLスキーム「kindle://」の作り方・使い方

ASINも位置数字も持ってるので作れますね。
ただ現在数字がカンマ区切りになってるので、カンマを消して(A25)、変数に入れておきます(A26)

※基本的には、前提のひとつ目のタスクから連続で実行することを想定しているので、そうじゃない場合はこのASINの番号が別の書籍になる場合があります。もしかしたらいけるのかもしれないですが、私はそこら辺はもう設定を諦めました。


手順7b:メモの不要部分を削除する

手順3で作っておいた下地

次はメモ(%note)部分です。
上記が今%noteに入ってる内容なので、この不要部分を削除していきます。

        <メモ不要削除の整形>
        A27: 変数内を検索・置換 / Variable Search Replace [
              変数: %note(%count)
              検索 / Search: Note:|                |ハイライト.*\s.*
              大小文字無視: オン
              複数行: オン
              一致を置換する: オン ]
    
        A28: 変数内を検索・置換 / Variable Search Replace [
              変数: %note(%count)
              検索 / Search: %kaigyo
              一致を置換する: オン
              エラーが起きても続ける:オン ]

これでメモもひとまず抜き出せました。


手順7c:メモのタグを取り出す

先ほど抜き出したメモの中で、「#●●」という記載があった場合はそれを抜き出して引用DBにタグをして入れることにしました。


        A29: If [ %note(%count) ~R \# ]
    
            A30: 変数を設定 / Variable Set [
                  名前: %test
                  これに: 正規表現とおってるよ〜
                  四捨五入する桁: 3
                  Structure Output (JSON, etc): オン ]
    
            A31: 変数内を検索・置換 / Variable Search Replace [
                  変数: %note(%count)
                  検索 / Search: (?<=#)([^#]*)
                  一致箇所を保存する配列: %tagnakami ]
    
            A32: 変数を設定 / Variable Set [
                  名前: %tag
                  これに: "タグ":{"multi_select":[
                  四捨五入する桁: 3
                  Structure Output (JSON, etc): オン ]

    
            A33: For [
                  変数: %tagcount
                  項目: 1:%tagnakami(#)
                  Structure Output (JSON, etc): オン ]
    
                A34: 変数を設定 / Variable Set [
                      名前: %tagadd
                      これに: {"name": "%tagnakami(%tagcount)"}
                      四捨五入する桁: 3
                      Structure Output (JSON, etc): オン ]
                    If  [ %tagcount = 1 ]
    
                A35: 変数を設定 / Variable Set [
                      名前: %tagadd
                      これに: ,{"name": "%tagnakami(%tagcount)"}
                      四捨五入する桁: 3
                      Structure Output (JSON, etc): オン ]
                    If  [ %tagcount > 1 ]
    
                A36: 変数を設定 / Variable Set [
                      名前: %tag
                      これに: %tag%tagadd
                      四捨五入する桁: 3
                      Structure Output (JSON, etc): オン ]
    
                A37: 変数内を検索・置換 / Variable Search Replace [
                      変数: %note(%count)
                      検索 / Search: %tagnakami(%tagcount)|#
                      一致を置換する: オン ]
    
            A38: For の終わり / End For
    
            A39: 変数を設定 / Variable Set [
                  名前: %tag
                  これに: %tag]},
                  四捨五入する桁: 3
                  Structure Output (JSON, etc): オン ]
    
        A40: Else
    
            A41: 変数を設定 / Variable Set [
                  名前: %tag
                  これに:  
                  四捨五入する桁: 3
                  Structure Output (JSON, etc): オン ]
    
        A42: If の終わり / End If

        A43: 変数を設定 / Variable Set [
              名前: %note(%count)
              これに:  
              四捨五入する桁: 3
              Structure Output (JSON, etc): オン ]
            If  [ %note(%count) 値なし ]   

A 32-36はnotionに値を入れる際のデータの整形をしています。

A36,A39で全て結合させています

A37はメモ本文の中にタグ情報は不要なので、削除するアクションです
A41,A43はタグがない時に%tagに半角スペースを入れるアクションです。Taskerの謎仕様で値の入っていない変数を表示させると変数名が表示されちゃうというのの回避です。

手順7d:引用DBに記録していく。

   
        A44: HTTP リクエスト / HTTP Request [
              方式: POST
              URL: https://api.notion.com/v1/pages
              ヘッダー: Authorization: Bearer secret_**トークンを入れてね**
             Notion-Version: 2022-02-22
             Content-type: application/json
              本文: {"parent":{"database_id":"**引用DBのIDを入れてね**"},  
             "properties": { 
             "引用": { "title": [ { "text": {
             "content": "%copy(%count)" } } ] },
             "URL":{"url":"https://read.amazon.co.jp/notebook"}, 
             "ハイライトカラー":{"select":
             {"name":"%color(%count)"}},  
             %tag
             "メモ":{"rich_text": [{ 
             "type": "text",
             "text": { "content": "%note(%count)"},  
             "plain_text": "%note(%count)", "href": null}
             ]}, 
             "位置":{"rich_text": [{
             "type": "text",
             "text":{"content":"%number(%count)"},
             "plain_text": "%number(%count)"}
             ]},  
             "URLスキーマ":{"rich_text": [{
             "type": "text",
             "text":{"content":"%url"},
             "plain_text": "%url"}
             ]},  
             "本":{"relation":[{"id":"%relationid"}]}
             }}
              制限時間 (秒): 30
              Structure Output (JSON, etc): オン ]
    
        A46: 待機 / Wait [
              ミリ秒: 0
              秒: 2
              分: 0
              時間: 0
              日: 0 ]
    
    A47: For の終わり / End For

    A48: 瞬間表示 / Flash [
          文字: 引用記録完了しました!
          長く: オン
          すぐに次のタスクに進む: オン
          Dismiss On Click: オン ]
    

最後です!
トークンやID、プロパティ名などを設定していってください。

とうとうこれで終わりです!!
半自動で、引用DBが出来ました!

引用DBには本のリレーションから本のURLのロールアップを表示させておくのがおすすめです。


お疲れ様でした!!!!!!!!!!!!

書いたはええけど、誰かやるんかこんなん…。もしどっかで詰まったらコメントください。


Swiftly Switchに入れるとき

Swiftly Switchにタスクを入れる時は「デバイスのショートカット」からtaskerを選んで、タスクのショートカットを選んでください。
この時、Taskerを終了しろみたいなことを言われます。

戻るボタン・・・・?となってちょっと困ったのですが、これはTaskerアプリで、右上の3点のメニューから終了を選んで終了すればOKです。


おまけ

正規表現をスマホでポチポチやるのだるいので、pushbulletというのをつかていました。

これで送った時点で、スマホのクリップボードに選択範囲の内容が入ってるので便利でした。スマホのクリップボードとPCのクリップボードを完全に同期させるには課金が必要そうでしたが、スマホのクリップボードに直接入れるだけなら、フリー版で大丈夫です。
pushbulletのスマホアプリの設定から、「リンクやメモを自動でコピー」というところをオンにしてください。
よければどうぞ〜


その他

私はKindle以外、ブックウォーカーで本を読むことも多いのですが、ブックウォーカーはそもそもハイライトのシェア系のボタンは一切ないし、コピーもできないので、HPの読書ノート(Kindleでいうメモとハイライトです)というところからどうにかするしかないんですよね。
それも同じ方法でnotionに飛ばすようにしました。
ただ、ランチャーのボタンが増えるのは嫌だったので、新しい振り分け用のタスクを用意して、コピー内容に含まれる文字列によって、どのタスクを実行するか、というのを振り分けて対応しています。

    タスク: ハイライト仕分けタスク
    
    A1: キーボード / Keyboard [
         入力: Control+A,Control+C
         入力間の時間: 500 ]
    
    A2: If [ %CLIP ~R Your Kindle Notes For: ]
    
        A3: 瞬間表示 / Flash [
             文字: kindleハイライトを記録開始します
             すぐに次のタスクに進む: オン
             Dismiss On Click: オン ]
    
        A4: タスク実行 / Perform Task [
             名前: ハイライトを記録
             優先度: %priority
             Structure Output (JSON, etc): オン ]
    
    A5: Else
    
        A6: 瞬間表示 / Flash [
             文字: BWハイライトを記録開始します
             すぐに次のタスクに進む: オン
             Dismiss On Click: オン ]
    
        A7: タスク実行 / Perform Task [
             名前: BWハイライト
             優先度: %priority
             Structure Output (JSON, etc): オン ]
    
    A8: If の終わり / End If
    
   


注意

シェア制限してるのには理由があるんだから今回の方法は個人利用のみで

悪用はぜっっっっったいにすんなよ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!



終わり。


この下には何もないです。
もし参考になったから昼飯でも奢ったろかいと思ったら買ってくれると嬉しいです♡

ここから先は

0字

¥ 500

この記事が気に入ったらサポートをしてみませんか?