GASでopenByUrlする前に存在有無を確認する

OpenByUrlで指定した外部のスプレッドシートを開く場合、いきなり呼ぶとURLが壊れていたときに分かりにくい例外が返ってきてしまうので、それに対処します。

これ、頻出だと思うのですが全然ネットに類似記事がない。
検索キーワードが悪いのでしょうか…凹むな…。

openByUrlに投げる

シンプルに呼び方はこう。

//対象ファイルを開く
let DataFile = SpreadsheetApp.openByUrl("ここにファイルURL");

URLが間違っていたり、つまり「そんなファイル無いよ」というときに投げられるのが以下の例外。

Unexpected error while getting the method or property openByUrl on object SpreadsheetApp.

f:id:hiro-29:20220330223907p:plain

さらにスプレッドシートでこのメソッドを呼んでいるのですが、この例外のときに出てくるメッセージボックスがこれ↓。

SpreadsheetAppオブジェクトでのopenByUrlメソッドまたはプロパティの取得中に予期しないエラーが発生しました。

ご丁寧に自動翻訳してくれるのですが、それでもこれは非エンジニアが見たら
訳わかんないのでエラーを出す前に状態を確認します。

httpステータスコードで存在確認しちゃう

他にやり方が思いつきませんでした。。邪道なのかなぁ。
(URLで存在確認できるメソッドなんて無い…よね?)

//ステータスコードを確認
if(getStatusCode("ここにファイルURL") != 200) throw new Error("URL間違ってるよ");

function getStatusCode(url) {
  const response = UrlFetchApp.fetch(url, {muteHttpExceptions: true})
  return response.getResponseCode()
}

こちら↓ コピペさせていただきました。
httpをこうやって処理できるの知らなかった。ありがたい。
iwb.jp


リファレンスはここ。
URL Fetch Service
developers.google.com

フォルダレベルでファイルの存在チェックしたら?

存在チェックと言う意味では、フォルダとその中身のファイルをWhileして「その名前のファイルある?」とやるのがもしかしたら正しいのかも。
ただ今回はアカウントやフォルダを無関係に、一発で指定させたかったのでちょっとな。

特定のフォルダ内で順次ファイル処理とかであればそうであるべきかも。

例外をキャッチしてメッセージ書き換えればいいじゃん

最初これやろうとしたんですが、エラーコードが返ってくるわけじゃないので他の例外との切り分けができなかったんです。
e.errorcode とかいうプロパティがあればいいんですが‥。

e.messageの文字列比較などを無理やりやればできるのかもしれませんが、気持ち悪かったのであんまりトライしてないです。