適材適所

PowerShellやVBAなどプログラミング系の話多めで

PowerShellでGoogle APIを使ってGoogleカレンダーの予定を削除する

PowerShellでGoogl Calendar API V3の.NET版を使って、

Googleカレンダーを操作しております。

今回は予定を削除する方法です!!

これまでの軌跡 PowerShellでGoogleカレンダーを操作するシリーズ

PowerShellでGoogle APIを使ってGoolgeカレンダーを操作する - 適材適所

PowerShellでGoogle APIを使ってGoogleカレンダーを操作する その2~予定を追加する~ - 適材適所

PowerShellでGoogle APIを使ってGoogleカレンダーを操作する その3~終日の予定を追加する~ - 適材適所

キモはEventsプロパティのDeleteメソッド

アセンブリのロードや、認証、Google Calendar APIサービスを取得するところまでは

これまでの流れを参考にしてください。

詳しい方法はこちらの記事から順番にご覧いただけると

わかりやすいと思います。

Google.Apis.Calendar.v3.CalendarServiceオブジェクトEventsプロパティの

Deleteメソッドを呼び出せば個々の予定を削除することができます。

メソッド名を見れば、一発でわかりますね。

 
#アセンブリのロード、認証については省略

##Create Google Calendar API service.
$baseClient=New-Object Google.Apis.Services.BaseClientService+Initializer
$baseClient.HttpClientInitializer =$credential
$baseClient.ApplicationName=$ApplicationName
$service=New-Object Google.Apis.Calendar.v3.CalendarService($baseClient)

#削除したい予定を取得
$calendarId="primary"
$delReq=$service.Events.List($calendarId)
$delReq.ShowDeleted=$false
$delReq.SingleEvents=$true
$delReq.OrderBy=[Google.Apis.Calendar.v3.EventsResource+ListRequest+OrderByEnum]::StartTime
#削除したい予定を$delEvents変数に格納
$delEvents=$delReq.Execute()
#ひとつずつ予定を削除
foreach($d in $delEvents.Items){
     [void]$service.Events.Delete($calendarId,$d.id).Execute()
 }

これでDeleteも完璧!!

っとそうは問屋が卸しませんでした。

しっかり落とし穴、ありました。

Deleteは関係なく、EventsResource+ListRequestのExcecuteメソッドにハマる

私が削除しようとしたのは、

なんと5年先までの予定が入ったカレンダーのすべての予定でした。

なんでそんな先まで予定入ってんねんって感じですよね。

お前は売れっ子かって感じですね。

真相はただ単純に毎週の予定を何も考えずに繰り返しで入れていただけです。

そのカレンダーから予定を全て削除すべく、

上述のコードを実行したところ、予定は削除されたかに見えました。

しかし、カレンダーを未来に進めていくと、なぜか残っている予定が。

何度やっても、残る。

なぜか、消えない。

おかしいなぁ、おかしいなぁと思って一行ずつステップ実行してみました。

そうすると、$delEventsの中の要素数(予定の数)が

250しかないことに気が付きました。

あれあれ?もっと削除したい予定はあるはずなのに・・・?

それもそのはず、5年先予定は

全部で800も登録されていました。

何度やっても250個しか取得できません。

おかしい、おかしい・・・

といって、ここで貴重な時間を費やしてしまいました。

そう、賢い読者の方はもうお気づきだと思いますが、

一度のリクエストで取得できる予定数に制限があったんですね。

この部分です。

#削除したい予定を$delEvents変数に格納
$delEvents=$delReq.Execute()

Excecuteメソッドで取得できるイベント数の

最大値のデフォルト数は250とのことでした。

こちらの公式リファレンスにも記載されていました。

Maximum number of events returned on one result page. The number of events in the resulting page may be less than this value, or none at all, even if there are more events matching the query. Incomplete pages can be detected by a non-empty nextPageToken field in the response. By default the value is250 events. The page size can never be larger than 2500 events. Optional.

デフォルトでは250ですが、

maxResultsプロパティを指定することでその数を増やすことができます。

最大で2500個まで指定できるようです。

上記のコードに付け加えるならば、

$delReq.MaxResults=2500

と指定してあげれば2500個まで予定を取得できます。

最初からリファレンスを読めよ、って話ですが・・・。

毎度のことながら、壁にぶち当たって読み始める・・・

学習しないですね。

では2500個以上の予定を削除したいときは?

今回ハマった8,000個以上の予定を

削除したいときはどうすればいいでしょうか。

これは、もうスマートな方法はありません。

力業で何度もリクエストを送ってあげます。

2500個以上の削除したい予定がある場合は

こんな風にしてみます。

 
$calendarId="Primary"
$delReq=$service.Events.List($calendarId)
$delReq.ShowDeleted=$false
$delReq.SingleEvents=$true
#リクエストの最大数を2500に指定
$delReq.MaxResults=2500
$delReq.OrderBy=[Google.Apis.Calendar.v3.EventsResource+ListRequest+OrderByEnum]::StartTime
$delEvents=$delReq.Execute()
#ひたすら予定を取得し続ける
while($delEvents.Items.Count -ne 0){
    foreach($d in $delEvents.Items){
        [void]$service.Events.Delete($calendarId,$d.id).Execute()
    }
    $delEvents=$delReq.Execute()
}

$delEvents.Items.Countが0になるまで、

延々と予定を取得し続けます。

おわりに

PowershellでGoogle Calendar APIを使って

予定を削除する方法を紹介しました。

一部力業な部分もありますが、

これでPowerShellで予定を削除することができます。

これで、Googleカレンダーで予定の作成、読み込み、変更、削除と、

CRUDがPowerShellでできるようになりました。

ここまで来れば、他のカレンダーと同期するプログラムができます!!

外部APIを使うときは、

とにかく動かしてみたい気持ちが先行してしまいがちですが、

はやる気持ちも抑えつつ、

ちゃんとドキュメントを読みましょうという教訓も教えてくれました。

あんまり暴挙を犯すと、APIの提供元にもご迷惑をおかけしてしまいますからね・・・。

さすが、Google先生。

そこにシビれる!あこがれるゥ!!

ここまでお読みいただき、ありがとうございました。