$ 【gtasks】
ターミナルでGoogle Tasksを操作する

Google Tasksは便利ですが、ブラウザで何度もタブを開いてタスクをチェックするのが面倒でした。

そこで導入したのが、Go言語で書かれたCLIツール「gtasks」です。
ターミナルだけで完結できれば、ずっとスムーズに作業できるはずです。
ただし、セットアップには少し手間がかかり、特にOAuth認証の設定では、いくつかの壁にぶつかりました。

関連記事

1. gtasksとは何か

gtasksは、Google Tasks APIを利用してタスクの表示や編集を行うCLIツールです。
BRO3886さんによって開発され、GitHubで公開されています12

1. gtasksとは何か

主な機能は次のとおりです。

  • タスクリストの一覧表示と作成
  • タスクの追加、編集、削除
  • タスクの完了マーク
  • 繰り返しタスクの設定

Google公式のツールではありませんが、OSSとして活発に開発されています。
Python版やNode.js版など、同様のツールは他にもありますが、gtasksはGo製のため単一バイナリで動作し、依存関係の管理が不要です。

1.1. 前提となる環境

この記事で扱う環境は以下のとおりです。

  • macOS(Apple SiliconまたはIntel)
  • Homebrew(パッケージマネージャー)
  • Goのバージョン1.18以上
  • Googleアカウント

1.2. Goのインストール

環境準備 1. Go v1.18以上 2. gtasks バイナリDL 3. PATH PATH設定例: export PATH=”$PATH:$HOME/go/bin”

gtasksはGoで書かれているため、まずGo自体をインストールします。
macOSではHomebrewを使うのが最も簡単です。

brew install go

Goは~/goというディレクトリをデフォルトの作業場所として使います。
この中のbinディレクトリに、後でgtasksがインストールされます。

1.3. gtasksのインストール

Goが使える状態になったら、gtasksをインストールします。
Goのinstallコマンドを使えば、ソースコードの取得からビルドまで自動で行われます。

go install github.com/BRO3886/gtasks@latest

~/go/binにバイナリが配置されたことを確認します。

1.4. PATHが通らない

ただし、この時点では、まだgtasksコマンドが使えません。
~/go/binがPATHに含まれていないためです。

which gtasks
gtasks not found

~/go/binがPATHに含まれていないためです。
環境変数を設定し、.zshrcに追記して永続化します。

そこで、ターミナルウィンドウでgtasksが使えるようにするためPATHを
追加します。

export PATH="$PATH:$HOME/go/bin"Code language: JavaScript (javascript)

恒久的に有効にするには、zshの設定ファイルに追記します。
echoコマンドで設定に追記して、実行するのも楽です。

echo 'export PATH="$PATH:$HOME/go/bin"' >> ~/.zshrc
source ~/.zshrcCode language: PHP (php)

2. Google Cloud側の設定

Google Cloud Console 設定 1 プロジェクト作成 2 Google Tasks API 有効化 3 OAuth クライアントID作成 種類: デスクトップアプリ 4 OAuth同意画面の設定 ユーザータイプ: 外部 5 テストユーザー追加 ⚠ 自分のアカウントを忘れずに追加

gtasksでログインしようとすると、エラーになります。

Login failed: failed to get OAuth2 config: no client ID found. Set GTASKS_CLIENT_ID environment variable or rebuild with client IDCode language: JavaScript (javascript)
2. Google Cloud側の設定

これは、環境変数GTASKS_CLIENT_IDが設定されていないときに出ます。
Google Cloud Consoleで作成したクライアントIDを、環境変数として設定する必要があります。

gtasksがGoogle Tasksにアクセスするには、OAuth 2.0による認証が必要です。
OAuth 2.0は、外部アプリに権限を委譲する標準プロトコルで、パスワードを渡さずにアクセス許可を与える仕組みです3

Google Cloud Consoleで、いくつかの手順を踏む必要があります。

2.1. プロジェクトの作成

Google Cloud Consoleにアクセスし、新しいプロジェクトを作成します。
プロジェクト名は任意でよいです。
たとえば「gtasks-cli」など、用途がわかる名前をつけると管理しやすいです。

2.1. プロジェクトの作成

これで、自分のGoogleアカウントの中に、入口となるプロジェクトができました。

2.2. Google Tasks APIの有効化

作成したプロジェクトで、「Google Tasks API」を有効にします。

2.2. Google Tasks APIの有効化
  1. 左側のメニューから「APIとサービス」→「ライブラリ」を選択
  2. 検索ボックスに「Google Tasks API」と入力
  3. 該当するAPIを選び、「有効にする」をクリック

2.3. OAuthクライアントIDの作成

次に、OAuthクライアントIDを作成します。
これがgtasksの認証情報になります。

  1. 「APIとサービス」→「認証情報」に移動
  2. 「認証情報を作成」→「OAuthクライアントID」を選択
  3. アプリケーションの種類は「デスクトップアプリ」を選ぶ
  4. 名前は任意でよい

作成が完了すると、クライアントIDとクライアントシークレットが表示されます4
この2つの値を控えておきます。
クライアントIDはxxxxx.apps.googleusercontent.comという形式です。

2.4. OAuth同意画面の設定

OAuthクライアントを作成する前に、同意画面の設定が必要になる場合があります。

  1. 「OAuth同意画面」に移動
  2. ユーザータイプは「外部」を選択
  3. アプリ名、サポートメールなど必要事項を入力

2.5. テストユーザーの追加

ここで重要なのは、テストユーザーの追加です。
アプリが「テスト中」の状態では、登録したテストユーザーしかアクセスできません。

この設定を忘れて、ログイン時に「アクセスをブロック」というエラーが出ました。
テストユーザーに登録されていないアカウントは、アプリへのアクセスが拒否されるためです。

2.5. テストユーザーの追加
アクセスをブロック: My gtasks は Google の審査プロセスを完了していません
エラー 403: access_denied

これは、OAuth同意画面でテストユーザーに自分のアカウントが追加されていない場合に出ます。
Google Cloud Consoleの「OAuth同意画面」で、自分のGmailアドレスをテストユーザーとして登録すれば解決します。

OAuth同意画面の設定中、または設定後に「テストユーザー」のセクションがあります5
ここに自分のGmailアドレスを追加します。

2.5. テストユーザーの追加
  1. 「テストユーザー」の「+ ユーザーを追加」をクリック
  2. 自分のGmailアドレスを入力
  3. 保存

3. gtasksの認証設定

Google Cloud側の準備ができたら、gtasks側で環境変数を設定します。
gtasksは、クライアントIDとクライアントシークレットを環境変数から読み取る仕様になっています。

OAuth 2.0 認証フロー 環境変数設定 gtasks login ブラウザで認証 トークン保存完了

3.1. 環境変数の設定

先ほど控えたクライアントIDとクライアントシークレットを、環境変数として設定します。

export GTASKS_CLIENT_ID="xxxxx.apps.googleusercontent.com"
export GTASKS_CLIENT_SECRET="your-client-secret"Code language: JavaScript (javascript)

この状態で、ログインを試みます。

gtasks login

ブラウザが自動で開き、Googleのログイン画面が表示されます。
アカウントを選択し、権限の許可を求められたら「許可」をクリックします。

認証が完了すると、トークンがローカルに保存されます。
以降は、トークンが有効な限り再認証は不要です。

4. gtasksの基本的な使い方

ログインが完了したら、いくつかの基本操作を試してみます。
(ラッパーを使うなら、gtaskswにする)。

基本コマンド タスクリスト表示 gtasks tasklists タスク表示 gtasks tasks view タスク追加 gtasks tasks add タスク完了 gtasks tasks done カスタム関数でさらに便利に zsh関数を作成して短いコマンドで操作可能
gtasks tasklists

Googleアカウントに登録されているタスクリストが一覧で表示されます。

tasksでは、まず、タスクリストを選択する画面が出るので、選択するとタスクのタイトルや完了状態が表示されます。

gtasks tasks

Usage:
  gtasks tasks [command]

Available Commands:
  add         Add task in a tasklist
  clear       Hide all completed tasks from the list
  done        Mark tasks as done
  info        View detailed information about a task
  rm          Delete a task in a tasklist
  undo        Mark a completed task as incomplete
  update      Update an existing task
  view        View tasks in a tasklist

Flags:
  -h, --help              help for tasks
  -l, --tasklist string   use this flag to specify a tasklistCode language: JavaScript (javascript)

4.1. よく使うコマンドの登録(gts)

ふだん使うコマンドは、短い方がよいので、gtsというzsh関数を作りました。

4.1. よく使うコマンドの登録(gts)
# タスク追加
gts a "買い物に行く"

# タスク完了
gts k 1

# タスク完了のやり直し(最近の完了タスクを戻す)
gts uCode language: PHP (php)

たとえば、gtsだけでタスクリストが表示され、gts a “タスク”だけでタスクを追加できます。
このコードは、.zshrcに直接書き込んでも良いですが、私は ~/.zshrc.d/gts.zsh を作って、 そこに保存しました。

4.1. よく使うコマンドの登録(gts)
gts() {
  local command="gtasksw"
  local list_name='すること'

  if [[ $# -eq 0 ]]; then
    # 一覧表示
    "$command" tasks view -l "$list_name"
    return
  fi

  case "$1" in
    add|a)
      # 追加: gts add "タスク名" / gts a "タスク名"
      if [[ -z "$2" ]]; then
        echo "エラー: タスク名を指定してください"
        return 1
      fi
      "$command" tasks add -l "$list_name" -t "$2"
      ;;
    kill|k)
      # 完了: gts kill 1 / gts k 1
      if [[ -z "$2" ]]; then
        echo "エラー: タスク番号を指定してください"
        return 1
      fi
      "$command" tasks done -l "$list_name" "$2"
      ;;
    undo|u)
      # 直前の操作を取り消し(1固定)
      "$command" tasks undo -l "$list_name" 1
      ;;
    *)
      echo "使い方:"
      echo "  gts                - タスク一覧"
      echo "  gts add \"タスク\"    - タスク追加 (gts a も可)"
      echo "  gts kill 1         - タスク完了 (gts k も可)"
      echo "  gts undo           - 直前の操作を取り消し (gts u も可)"
      return 1
      ;;
  esac
}
Code language: PHP (php)

tasks viewにCSVフォーマットにして、awkでカンマに区切って、出力しています。

.zshrcには、以下を追加して読み込むようにしています。

source ~/.zshrc.d/gts.zshCode language: JavaScript (javascript)

最終的には、リスト表示の最大文字幅の整形などで、以下のようなスクリプトにしました。

5. 環境変数を直接書きたくない場合

シェルの設定ファイルにクライアントシークレットを直接書くのは、セキュリティ上望ましくありません。
特に設定ファイルをクラウドに同期している場合、意図せず公開されるリスクがあります。

より安全な方法として、macOSのKeychainを利用する方法があります。
Keychainは、macOSが提供する資格情報保管庫で、パスワードやトークンを暗号化して保存します。

Keychainにクライアントシークレットを保存するコマンドは次のとおりです6

security add-generic-password -a "$USER" -s GTASKS_CLIENT_SECRET -w 'your-client-secret' -UCode language: JavaScript (javascript)

同様にクライアントIDも保存できます。

security add-generic-password -a "$USER" -s GTASKS_CLIENT_ID -w 'your-client-id' -UCode language: JavaScript (javascript)

.zshrcには、取り出すコマンドだけを書きます。

export GTASKS_CLIENT_ID="$(security find-generic-password -a "$USER" -s GTASKS_CLIENT_ID -w)"
export GTASKS_CLIENT_SECRET="$(security find-generic-password -a "$USER" -s GTASKS_CLIENT_SECRET -w)"Code language: JavaScript (javascript)

この方法なら、シークレット本体は.zshrcに書かれません。
初回実行時、macOSが「securityコマンドがKeychainにアクセスしようとしています」という確認ダイアログを表示することがあります7
「常に許可」を選べば、以後は自動で読み込まれます。

5.1. 環境変数を常駐させない方法

ただし、Keychainを使っても、環境変数として読み込んでしまえば、シェルのセッション中は値が露出します。
そこで、必要なときだけ読み込むラッパースクリプトを作る方法もあります。

~/.config/gtasks/envというファイルを作成し、そこに環境変数を記述します。

mkdir -p ~/.config/gtasks
chmod 700 ~/.config/gtasks
cat > ~/.config/gtasks/env <<'EOF'
export GTASKS_CLIENT_ID="xxxxx.apps.googleusercontent.com"
export GTASKS_CLIENT_SECRET="your-client-secret"
EOF
chmod 600 ~/.config/gtasks/envCode language: JavaScript (javascript)

次に、ラッパースクリプトを作成します。
~/binに配置する場合を想定します。

mkdir -p ~/bin
cat > ~/bin/gtasksw <<'EOF'
#!/bin/zsh
set -e
source "$HOME/.config/gtasks/env"
exec gtasks "$@"
EOF
chmod +x ~/bin/gtaskswCode language: PHP (php)

~/binをPATHに追加します。

echo 'export PATH="$HOME/bin:$PATH"' >> ~/.zshrc
source ~/.zshrcCode language: PHP (php)

これで、gtaskswコマンド経由で実行すれば、その実行中だけ環境変数が読み込まれます。

gtasksw login
gtasksw tasklists

普通のシェルセッションでは、GTASKS_CLIENT_SECRETは空のままです。

echo "$GTASKS_CLIENT_SECRET"Code language: PHP (php)

何も表示されなければ、意図どおりに動作しています。

6. 【補足】トークンの保存場所(.gtasks)

gtasksは、認証後にトークンをローカルに保存します。
このトークンを使って、以後はブラウザを開かずにAPIにアクセスできます。

トークンの保存場所は、通常~/.gtasksまたは環境変数で指定された場所です8
ファイルは平文で保存されるため、共有PCでは注意が必要です。

トークンが漏れると、第三者があなたのGoogle Tasksにアクセスできる可能性があります。
ファイルのパーミッションを確認しておくと安心です。

もし存在するなら、パーミッションを600に設定しておきます9

ls -la ~/.gtasks

chmod 600 ~/.gtasks/token.json

7. まとめ

gtasksを使えば、ターミナルだけでGoogle Tasksを操作できます。
ブラウザを開く手間が省け、コマンド一つでタスクを確認・追加できるのは快適です。

ただし、セットアップには少し手間がかかります。
特にGoogle Cloud側のOAuth設定は、初めてだと戸惑う部分が多いです。
テストユーザーの追加を忘れると403エラーが出ますし、環境変数の設定も見落としやすいです。

それでも、一度設定してしまえば後は楽です。
環境変数の管理方法も、Keychainを使うかラッパースクリプトを作るか、自分の運用に合わせて選べます。

  1. BRO3886さんのレポジトリは、2020年12月からのもので、2025年7月時点でも活発に開発されており、最新版は0.10.0です。そのフォークや gtasks cli の同様の後発プロジェクトもあるので、少しずつコマンド体系が違うかもしれません。 – gtasks command – github.com/yanicksenn/workspace/go/cmd/gtasks – Go Packages
  2. 他の類似プロジェクトとしては、Python製のsirusdas/gtasks-terminalやdevoc09/gtodoなどがあり、それぞれ異なる機能セットとコマンド体系を持っています。使用する際は、プロジェクト名とGitHubリポジトリを確認してください。 – GitHub – devoc09/gtodo
  3. OAuth 2.0の認証フローでは、アクセストークン(有効期限1時間)とリフレッシュトークンが発行されます。リフレッシュトークンを使用することで、ユーザーが再ログインすることなく新しいアクセストークンを取得できます。 – Using OAuth 2.0 to Access Google APIs
  4. gtasksが使用する認証リダイレクトURIは、localhost:8080/callback、localhost:8081/callback、localhost:8082/callback、localhost:9090/callback、localhost:9091/callbackです。これらのポートがファイアウォールでブロックされていないことを確認してください。 – GitHub – BRO3886/gtasks
  5. アプリの公開ステータスが「テスト中」の場合、リフレッシュトークンは7日後に期限切れになります。長期間使用する場合は、OAuth同意画面の「Publishing status」を「In production」に変更することを推奨します。ただし、個人利用の場合は未検証のアプリとして警告画面が表示されますが、「詳細」から「安全でないページに移動」を選択することで利用可能です。 – Unverified apps – Google Cloud Platform Console Help
  6. -Uフラグは既存のKeychainエントリを更新するためのものです。初回実行時は-Uフラグを外してください。-Uフラグを付けたまま初回実行すると、エントリが存在しないためエラーになります。更新時のみ-Uフラグを使用します。 – Get Password from Keychain in Shell Scripts – Scripting OS X
  7. セキュリティコマンドでKeychainにアクセスする際、「常に許可」を選択すると、/usr/bin/securityバイナリがそのパスワードに恒久的にアクセスできるようになります。同じsecurityバイナリを使用する他のスクリプトもアクセス可能になるため、非常に機密性の高い情報の場合は「許可」を選択し、毎回確認する方が安全です。 – Command line access to the Mac keychain
  8. 正確には~/.gtasks/token.jsonに保存されます。このファイルにはOAuth 2.0のアクセストークンとリフレッシュトークンがJSON形式で平文保存されています。アクセストークンの有効期限は1時間ですが、リフレッシュトークンを使用して自動的に更新されます。 – GitHub – BRO3886/gtasks
  9. パーミッション600は、所有者のみが読み書き可能で、グループやその他のユーザーはアクセスできない設定です。共有環境や複数ユーザーが使用するマシンでは、このパーミッション設定は必須です。さらに、~/.gtasksディレクトリ自体にもchmod 700を設定することを推奨します。 – Token Security – gtasks-terminal