sironekotoroの日記

Perl で楽をしたい

Perl で Google Sheet API をつかってセルの値を取得する

これも GET だけでできるのでお手軽ー

説明よりもコードを読んでもらったほうが早い気がする。

配列リファレンスの中の配列リファレンス、てな形でデータが取得できるので、csv にするなりなんなり後は自由自在ですね(力量による)

ちょっと詰まったところ

この API は取得するセルの範囲を指定する必要があります。

シート1!A1:C2 こんな感じで。

もう一段楽をするためには、値が入っているセルの範囲を取得する必要があります。

値が入っているセルの行と列の最大値が欲しい・・・!

Google Apps Script だと getLastRow() とか getLastColumn() みたいなやつ。

developers.google.com

となると、API でアクセスして、情報が入っている最後の Row(行)と Column(列)を把握して・・・あれー、そんな関数見当たらないぞー

困ったときは Google 先生、そして stack overflow。

stackoverflow.com

You can set the range to "A2:D" and this would fetch as far as the last data row in your sheet.

あ、そういう・・・列さえ把握しておけばいい的な・・・

で解決したのでした。

Perl で Gogle Sheet API をつかってセルの値を取得する

以下がコードです。

情報をとるときには 2 つの方法 values.get, values.batchGet があるので、太っ腹に両方やってみました。

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

use Data::Dumper;
use HTTP::Tiny;
use JSON;
use URI::QueryParam;
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 );

values_get();
values_batchGet();


# Method: spreadsheets.values.get
# https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/get
sub values_get {
    my $ht
        = HTTP::Tiny->new( default_headers => { Authorization => $bearer, } );

    my $SHEET_URI
        = $GOOGLE_SHEET_API . $SPREADSHEET_ID . '/values/シート1!A1:C';
    my $URI = URI->new($SHEET_URI);

    my $res  = $ht->get($URI);
    my $data = decode_json( $res->{content} );

    print Dumper $data->{values};

}

# Method: spreadsheets.values.batchGet
# https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/batchGet
sub values_batchGet {
    my $ht
        = HTTP::Tiny->new( default_headers => { Authorization => $bearer, } );

    my $URI
        = URI->new( 'https://sheets.googleapis.com/v4/spreadsheets/'
            . $SPREADSHEET_ID
            . '/values:batchGet' );
    $URI->query_param( ranges => 'シート1!A1:C');

    my $res = $ht->get($URI);
    my $data = decode_json( $res->{content} );

    print Dumper $data->{valueRanges}->[0]->{values};

}