見出し画像

#52 タスクをプログラムで登録する

以下で説明しているような Google スプレッドシートの内容を、Google カレンダーに予定(イベント)として書き出して、公私の予定をGoogleカレンダーで管理しています。
この方法でスケジュール管理するようになってから、職場のパソコンだけでなく、持ち歩いているスマートフォン(iPhone)でも予定を確認・追加できるので、とても便利です。

この記事では、「予定」ではなく「タスク」を GAS のプログラムで登録する方法を確認してみました。

使用方法

①スプレッドシートをコピー

以下の URL にアクセスして、自身のマイドライブに作業用のスプレッドシートをコピーしてください。

https://docs.google.com/spreadsheets/d/12-KRLnzKUcRD6ChdSSl-U283ZHU6ZPAuzIR5fogvvF0/copy

コピーされたスプレッドシートには、「メイン」と「リスト」という 2つのシートがあります。主に、シート「メイン」で操作を行います。

シート「メイン」の画面イメージ

②対象となる「リスト」を指定

まずは、「リストの取得」ボタンを押して、自身の Google アカウントで作成されているタスクリストの一覧を取得します。
スクリプトの初回実行時には、実行するアカウントによる確認作業が必要になります。詳しくは以下の投稿をご覧ください。

「リストの取得」ボタンを押すと、シート「リスト」にリストの一覧が取得され、セル B2 でドロップダウンリストによって、処理対象となるリストが選択できます。

「タスク一覧の作成」ボタンを押すと、セル B2 で指定されているリストに登録されているタスクが、リストの名前が設定されたシートに一覧出力されます。

  • この処理は Google 側から提供されている API の動作確認のために作成したもので、タスクの追加には関係ありません。

③登録する「タスク」を設定

シート「メイン」の7行目以降に、以下の 3つの項目を設定します。notes については空欄でも構いません。

  • due : タスクの期限

  • title : タスクのタイトル

  • notes : タスクの詳細

登録するタスクの情報が準備できたら、「タスクの追加」ボタンを押すと、タスクが指定されたリストに追加されます。

  • 列 D に実行結果(OK に続けて表示されているのは、タスクの ID)が表示されます。 ※何となく ID を表示させているだけで、何かに使う意図があるわけではありません。

  • 列 D に前回の実行結果が残っている場合など、列 D が空欄ではない行については処理が行われません。

  • 「結果のクリア」ボタンを押すと、列 D の実行結果はすべてクリアされます。

列 D に実行結果が表示される

注意事項

大量のタスクを一括登録する場合、下図のようなエラーが発生してしまう場合があります。

大量のタスクを登録するときには最大値を超えてしまうかも?

これは、以下の記事でも触れたように、一度に処理できる時間には 6分間という時間制限が設けられているためです。

そのため、下図のように 360秒(6分間)を過ぎたところでタイムアウトが発生してしまいます。

通常の Google アカウントは 6分間が時間制限

列 D の実行結果が「OK」ではない行については、当該行の実行結果を消して空欄にして、再度「タスクの追加」ボタンを押します。列 D が空欄になっている行に対して、処理が行われます。

また、
シート内に設定された情報に基づいて、連続して一括登録を行うと、原因不明のエラーが発生する場合がありました。試行錯誤した結果、以下のようにプログラム中にウエイト処理を追加することで、エラーが発生しなくなったように見受けられます。

Utilities.sleep(1000);

このウエイト処理を追加したことでエラーが発生しなくなったかもしれませんが、その分だけ登録処理に要する時間は長くなり、前述の時間制限に引っかかりやすくなっています。
大量のタスクを一括登録する場合にはご注意ください。

「予定」と「タスク」の違い

今回のプログラムを作成して、「予定」として作成する場合のプログラムが

function addToCalender(name, due, message, calcId) {
  return CalendarApp.getCalendarById(calcId).createAllDayEvent(
    name,
    due,
    {
      description: message,
    }
  );
}

という感じだったとしたら、「タスク」として作成する場合には、

function addToTaskList(name, due, message, taskListId) {
  const tasklist = Tasks.Tasklists.get(taskListId);
  const dueDay = Utilities.formatDate(due, "JST", "yyyy-MM-dd");
  return Tasks.Tasks.insert(
    {
      'title': name,
      'notes': message,
      'due': dueDay + "T00:00:00.000Z",
    },
    tasklist.id
  );
}

といった感じになります。
いずれも同じような引数で「予定」として作成するか、「タスク」として作成するかが違います。 ※それぞれの関数で、最後の引数に出力先となる「カレンダー」や「リスト」を示す ID(calcId、taskListId)を指定しています。
似たような処理だけに、同じようなプログラムになりますね。

参考にしたページ

Google側が提供しているリファレンスとサンプルプログラム。リストの取得や、タスクの取得については、これらのサンプルプログラムがベースになっています。

タスクに関する処理を GAS で行っている事例があまり見当たらなかったなか、個人のブログで案内されていたサンプルプログラム。期限となる日付情報を指定する方法について、参考にさせていただきました。

最後に

今回のプログラムは、上記 URL で Google が提供しているサンプルプログラムに、Google スプレッドシートによる UI を付けて、タスクを登録しやすくした感じです。Google カレンダーに「予定」ではなく「タスク」として表示させたい場合に、使えるのではないかと思います。

最後に、お決まりのフレーズなどを書いておきます。

  • 一応の動作確認は行っているものの、不慮のトラブルによって損害等が生じても、責任はとれませんので予めご了承ください。
    ※作成したスクリプトは、「Google カレとンダー」「ToDo リスト」への書き込みは行っていますが、別のサイトやファイルへの書き込みは行っていません。

  • コメントを含めても 200行程度のスクリプトであり、実行に際して目的外の場所への書き出しや収集などは行っていないはずです。

  • 特別なエラー処理は行っていないので、意図しないケースでエラーが発生してしまうかもしれません。どうにもならない場合には、ご連絡ください。

わたし自身にしてみると、このような「スクリプトを作ること」が目的になっているような感じですが、このスクリプトが何かの役に立てば幸いです。


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