[PHP] Google Sheets API でシートの存在チェック

2019-09-21PHPGoogle

Google Sheets API ( v4 ) を使って、シートにシート名でアクセスするとき、そのシート名が存在しない場合、エラーとなる。 Google_Exception で catch することはできるが、エラーではなく別の処理を実行したいとか、なければ新たにシートを作成するとかの場合は、シート名の存在を確認したい。
しかし API には、簡単に存在チェックできるメソッドはないので、スプレッドシートから全部のシート名を取得して、対象のシート名が存在するか確認する。

存在しないシート名でアクセスした場合

スプレッドシートに「シート1」しかないのに、「シート2」からセルの値を取得しようとするとエラーになる。

$service = new Google_Service_Sheets($client);
$spreadsheetId = 'スプレッドシートの URL にある spreadsheetId';
$range = 'シート2!A1:B5';
echo "1";
$response = $service->spreadsheets_values->get($spreadsheetId, $range);
echo "2";
$values = $response->getValues();
var_dump($values);

エラーメッセージ

Fatal error: Uncaught Google_Service_Exception: { “error": { “code": 400, “message": “Unable to parse range: シート2!A1:B5", “errors": [ { “message": “Unable to parse range: シート2!A1:B5", “domain": “global", “reason": “badRequest" } ], “status": “INVALID_ARGUMENT" } } in …..
Google_Http_REST::execute(Object(GuzzleHttp\ in /hoge/hoge/vendor/google/apiclient/src/Google/Http/REST.php on line 118

Google_Exception で catch することもできる

try{
  $spreadsheetId = 'スプレッドシートの URL にある spreadsheetId';
  $range = 'シート2!A1:B5';
  echo "1
"; $response = $service->spreadsheets_values->get($spreadsheetId, $range); echo "2"; $values = $response->getValues(); var_dump($values); } catch (Google_Exception $e) { $errors = json_decode($e->getMessage(),true); echo "code : ".$errors["error"]["code"]."
"; echo "message : ".$errors["error"]["message"]; }

echo の出力内容

1
code : 400
message : Unable to parse range: シート2!A1:B5

シート名の存在チェック

スプレッドシートから全部のシート名を取得して、検索対象のシート名が存在するか確認するコード

function sheetsExistCkc($sheetsList, $sheetName) {
  foreach($sheetsList as $sheet) {
    if($sheet->properties->title === $sheetName) {
      return true;
    }
  }
  return false;
}
$service = new Google_Service_Sheets($client);
$spreadsheetId = 'スプレッドシートの URL にある spreadsheetId';
$response = $service->spreadsheets->get($spreadsheetId);
$allsheets = $response->getSheets();
if(sheetsExistCkc($allsheets, 'シート2')) {
  echo "exist";
} else {
  echo "not exist";
}

Posted by Agopeanuts