sironekotoroの日記

Perl で楽をしたい

Perl で Google Sheet API をつかってタイトルを変更する

なんか、適当に文言を入れ替えて自動生成したみたいなタイトルになってきたなぁ・・・

それはそれとして、Google Drive API に引き続き、Google Sheet API を使ってホゲホゲするってやつです。

以前、モジュールを使ってやってみたんですが、せっかく Web API 投げる方法もわかったことだし、この方法でやってみよう!ってことで。

使う都度 Any::Moose の警告が出るのが気に食わないってのもあります。

sironekotoro.hateblo.jp

Google Sheet API の許可とアクセストークン が必要です

かつての記事で書いてます・・・なんか、遠い昔の気がする

sironekotoro.hateblo.jp

sironekotoro.hateblo.jp

タイトルを変更する

まずはジャブから・・・早速、公式のリファレンスを確認します。

developers.google.com

おぉ、わかりやすい。もっと他の言語での実装例を参考にして回るかと思ってた。あっさり。

リファレンスにあるリクエストボディ は json にしておく必要があります。

これは先のページには書いてないんですが、正しい構造のJSON 送らないとエラーで「まともな JSON で送って〜」と言われます。

今回は好みで HTTP::Tiny 使いました。

リクエストボディを設定するときは公式リファレンスの \%options のところで content をキーにする必要があるので注意です。

metacpan.org

エラーメッセージを見て直しつつ完成したのが以下スクリプトです。

#!/usr/bin/env perl
use strict;
use warnings;

use HTTP::Tiny;
use JSON;
use URI;
use utf8;

my $SPREADSHEET_ID = '1sVNSpvtWPPkv5Qnb0tifYHpKMxaehxj5ChAeQ1G1kgA';

my $ACCESS_TOKEN = '';

my $GOOGLE_SHEET_API = "https://sheets.googleapis.com/v4/spreadsheets/";

my $bearer = join " ", ( 'Bearer', $ACCESS_TOKEN );

my $ht = HTTP::Tiny->new( default_headers => { Authorization => $bearer, } );

my $url = URI->new( join "",
    ( $GOOGLE_SHEET_API . $SPREADSHEET_ID . ':batchUpdate' ) );

my $response = $ht->request(
    'POST',
    $url,
    {   content => encode_json {
            requests => [
                {   updateSpreadsheetProperties => {
                        properties =>
                            { title => "Perl から API 叩いて変更したタイトル" },
                        fields => "title"
                    }
                }
            ]
        }
    },
);

print $response->{status} . "\n";
print $response->{reason} . "\n";

f:id:sironekotoro:20201121164441p:plain

ちなみに、タイトルを変えても更新日は変わらない模様。