読者です 読者をやめる 読者になる 読者になる

デスクトップからたすくまへ最速でタスクを登録するAutomatorアプリとシェルスクリプト

その他 その他-Mac

プッシュ通知サービスのPushoverを使って、たすくまのタスク登録用URLスキームをMacからiPhoneへサクッと送信するAutomatorアプリを作りました。 

中身はただのシェルスクリプトなので、Bash on Windowsで動作させるのも可能なのではないかと思います。多分。
Windows用に多少手直ししたコードをこの記事の最後に載せておきます。

最近Pushoverのライセンスを購入しましたので、サービスが長く続いてくれるよう応援の意味も込めたエントリーです。


▼母艦のキーボードでタスクをタイプしてOKすると
f:id:four_or_three:20170218110307j:plain
▼5秒くらいで登録用URLがiPhoneに届きます
f:id:four_or_three:20170218105850p:plain:w250

青い文字にリンクが貼られています。

今回のエントリーでは、基本となるキーボードでテキストを入力するアプリと、テキスト選択の右クリックから実行するAutomatorサービスを紹介します。
エクセルのセルコピーから一括送信とか、WorkFlowyの選択コピーから一括送信できるバージョンなどは、需要がありましたら。

ダウンロード

https://www.dropbox.com/sh/1mo74u8wkpn3ml7/AADNrXlEYmlQ4jdGcl3WNrGVa?dl=0

◯◯.appがアプリ、◯◯.workflowがサービスです。
サービスはダブルクリックでインポートされます。


↓このエントリーとは直接関係はありませんが、Pushoverを補助するツール2つ作ったやつ

使用開始までの手続き

  1. iPhoneにPushoverをインストール後、Pushoverのアカウントを作る

    Pushover Notifications

    Pushover Notifications

    • Superblock
    • ユーティリティ
    • 無料
    有料アプリですが、7日間はフル機能がお試しできます。
    過去にお試ししたことがある場合でも、再試用は可能だと思います。

  2. PushoverのSettingsでUser Keyとデバイス名を確認する

  3. https://pushover.net/apps/buildで新規アプリを登録し、APIトークンを発行
    Type:Script、Description:適当、URL:空欄、Icon:なしでOK
  4. アプリ、サービスをAutomatorで開き、シェルスクリプトの1〜3行目に2.3.を記入して上書き保存
    サービスは/Users/ユーザ名/Library/Servicesにあります。

以上で完了です。

アプリ版は、初回起動だけ 右クリックメニュー → 開く、として下さい。

サービス版の「変数の値を設定」、「テキストの入力を求める」の2つのアクションは、右クリックで取り込んだテキストに見積もり時間やプロジェクトを追記するためのものですので、必要ない場合はこの2つのアクションを削除してください。

入力するテキストの書き方

基本
タスク1<tab>20<tab>プロジェクト1
タスク2<tab>30<tab>プロジェクト2


このように、タスク名と見積もり時間とプロジェクト名をタブ文字で区切って記述します。
これを基本として、だいたいどのような書き方でも読み込めるようになっています。

タスク名だけ

以下5例はどれもOKな書き方です。
タスク1
タスク1<tab>
タスク1<tab><tab>
タスク1<tab>0
タスク1<tab>0<tab>

タスク名と見積もり時間

以下2例はどれもOKな書き方です。
タスク1<tab>20
タスク1<tab>20<tab>

タスク名とプロジェクト名

以下3例はどれもOKな書き方です。
タスク1<tab>プロジェクト1
タスク1<tab><tab>プロジェクト1
タスク1<tab>0<tab>プロジェクト1

その他

見積もり時間は全角数字でもOK
タスク1<tab>20<tab>プロジェクト1

空行OK

タスク1<tab>15<tab>プロジェクト1
タスク2<tab>20<tab>プロジェクト2

タスク3<tab>10<tab>プロジェクト3

コード

標準入力を読み取って、たすくまの登録URLを生成し、Pushoverにポストするシェルスクリプトです。
Windowsで動く(かもしれない)ように若干手直ししています(動くかもしれない)。

Macでは動きませんのでご注意。

▼使い方

$ bash this_script.sh < task_list.txt


文字コードShift-JIS、改行コードCRLFのテキストを標準入力に読み込ませてください。
テキストの書き方は、上記の「テキストの書き方」を参照下さい。

実際に使用する際には、まず上記の起動コマンドをシェルスクリプトとして保存(launch.sh)して、chmodコマンドで実行権限を与えておき、

をバッチファイルか何かで自動化できれば、MacAutomatorを使う場合と比べてそう遜色のない使い勝手になるのではないでしょうか。

#!/bin/bash

readonly APP_TOKEN="your app token"
readonly DEVICE="your device"
readonly KEY="user key/group key"
readonly TITLE="🐻たすくまに登録"
readonly SOUND="pushover"
readonly FONT_SIZE="3"

function curl_pushover() {
    curl -f \
        --form-string "token=$APP_TOKEN" \
        --form-string "user=$KEY" \
        --form-string "device=$DEVICE" \
        --form-string "title=$TITLE" \
        --form-string "sound=$SOUND" \
        --form-string "html=$1" \
        --form-string "message=$2" \
        --form-string "url=$3" \
        https://api.pushover.net/1/messages.json
}

function post_message_pushover() {
    local count_total=0
    local num_message=0
    local str_joined=()
    for line in "$@"
    do
        count_total=$(($count_total + ${#line} + 2))
        if [ $count_total -gt 990 ]; then
            ((num_message++))
            count_total=$((${#line} + 2))
        fi
        str_joined[$num_message]+="\n$line\n"
    done
    local url=""

    i=1
    for var in "${str_joined[@]}"
    do
        local message=$(echo -e "$var")
        if [ ${#str_joined[@]} -gt 1 ]; then
            message="(${i}/${#str_joined[@]})$message"
        fi
        message="<font size=\"${FONT_SIZE}\">${message}</font>"
        curl_pushover "1" "$message" "$url"
        if [ $? != 0 ]; then
            return 1
        fi
        ((i++))
    done
}

function url_encode() {
    echo "$1" | perl -MURI::Escape -lne 'print uri_escape($_)'
}

function change_to_halfnum() {
    echo "$1" | sed 'y/1234567890/1234567890/'
}

function is_numeric() {
    expr "$1" + 1 >/dev/null 2>&1
    if [ $? -lt 2 ]; then
        echo 0
    else
        echo 1
    fi
}

IFS_original=$IFS
IFS=$'\t'

text_input=$(iconv -f SHIFT-JIS -t UTF-8 | tr -d '\r' | grep -v ^\s*$)

if [ -z "$text_input" ]; then
    exit 1
fi

i=1
while read line
do
    set -- $line
    task="$1"
    task_encoded=$(url_encode "$1")
    if [ -z "$2" ]; then
        est_time=0
        project=""
        project_encoded=""
    else
        est_time=$(change_to_halfnum "$2")
        if [ $(is_numeric "$est_time") = 0 ];then
            project="$3"
            project_encoded=$(url_encode "$3")
        else
            est_time=0
            project="$2"
            project_encoded=$(url_encode "$2")
        fi
    fi
    description="$task | ${est_time}分 | $project"
    url_scheme="taskuma://add?taskname=${task_encoded}&estimated=${est_time}&project=${project_encoded}"
    message_arr=("${message_arr[@]}" "${i}. <a href=\"${url_scheme}\">${description}</a>")
    ((i++))
done << EOS
$text_input
EOS

IFS=$IFS_original

if [ ${#message_arr[@]} = 1 ]; then
    message="<font size=\"${FONT_SIZE}\"><a href=\"${url_scheme}\">${description}</a></font>"
    curl_pushover "1" "$message" "$url_scheme"
else
    post_message_pushover "${message_arr[@]}"
fi
広告を非表示にする