適材適所

PowerShellやVBAなどのプログラミングに関すること、キャリア、子育ての3本で書いていきます

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

PowerShellでGoogl Calendar API V3の.NET版を使って、予定を削除する方法を紹介します。

PowerShellでGoogleカレンダーを操作するシリーズ

PowerShellでGoogleカレンダーを操作する - 適材適所

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

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

流れ

アセンブリのロードや、認証、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()
 }

ドはまりポイント

私が削除しようとしたのは、5年先までの予定が入ったカレンダーの、すべての予定でした。

コードを実行したところ、目論見通り、予定は削除されたかに見えました。

でも全部消えたかと言うと、全部は消えておりませんでした。

何度やっても、全部は消えない。

なぜか、消えない。

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

そうすると、$delEventsの中の要素数(予定の数)が250しかないことに気が付きました。

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

それもそのはず、5年先の予定まで入って、全部で800の予定が登録されているはずだったんです。

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

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

そう、賢い読者の方はもうお気づきだと思いますが、一度のリクエストで取得できる予定数に制限があったんですね。

最大値のデフォルトは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.

maxResultsプロパティをちゃんと指定してあげれば、最大で2500個までの予定を取得できるようです。

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

$delReq.MaxResults=2500

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

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

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

学習しないですね。

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

もうこれは、しょうがないので、力業で何度もリクエストを送るしかありません。

先ほどの例でもし2500個以上の削除したい予定がある場合は、こんな風にしてみてはどうでしょうか。

$calendarId="Primary"
$delReq=$service.Events.List($calendarId)
$delReq.ShowDeleted=$false
$delReq.SingleEvents=$true
$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で予定を削除することができます。

外部APIを使うときは、とにかく動かしてみたい気持ちが先行してしまいがちですが、

はやる気持ちも抑えつつ、ちゃんとドキュメントを読みましょうという教訓も教えてくれました。

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

さすが、Google先生。

でも、やっぱり動かしたい、という気持ちが優先してしまうことも否めません・・・。

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