質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

解決済

1回答

4658閲覧

GASで短縮URLを発行したいが、意図したURLを短縮してくれない

tackt1107

総合スコア7

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

0グッド

0クリップ

投稿2018/04/18 05:00

前提・実現したいこと

GASでbitlyの短縮URLをスプレッドシート上で自動で発行する関数を組もうとしています。
下記のコードで短縮URLは発行できているのですが、元のURLの一部のみを認識しているようで、
URL全体を短縮してくれません。

どうやら、&以下を認識してくれていないようで、
おそらく正規表現の指定が誤っているのかと思うのですが、見たところ間違っている箇所が見当たりません。
解決方法がわかりましたら、ご教示いただけますでしょうか。

発生している問題・エラーメッセージ

元URL https://google.com?creative_id=18512&token=ead17d00f5465b1fe67800de84e9d15c4ce58174&utm_medium=twitter_org&utm_source=gis19 短縮URL http://bit.ly/2qHyNpW 短縮URL展開 https://www.google.com/?creative_id=18512

該当のソースコード

GAS

1/** 2 * Returns a shortened URL of the input. 3 * 4 * @param {string} longUrl The long URL to shorten. 5 * @return The shortened url. 6 */ 7function shortenUrl(longUrl) { 8 try { 9 var regexp = /^(https?|ftp)(://[-_.!~*\'()a-zA-Z0-9;/?:\@&=+$,%#]+)$/; 10 if (typeof longUrl != 'string' || !regexp.test(longUrl)) throw new Error('Invalid args'); 11 var response = BitlyUrlShortenerService(longUrl); 12 return response.data.url; 13 } catch(e) { 14 return e.toString(); 15 } 16} 17 18/** 19 * Returns a analytics of the short URL. 20 * 21 * @param {string} shortUrl 22 * @return click count 23 */ 24 25function BitlyUrlShortenerService(longUrl) { 26 var accessToken = PropertiesService.getScriptProperties().getProperty('BITLY_ACCESS_TOKEN'), 27 apiUrl = 'https://api-ssl.bitly.com/v3/shorten?access_token='+accessToken+'&longUrl='+longUrl, 28 response = UrlFetchApp.fetch(apiUrl); 29 if (response.getResponseCode() !== 200) { 30 throw new Error('Unable to bit.ly API'); 31 } else { 32 return JSON.parse(response); 33 } 34} 35 36

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

(Google Apps Scriptはよく知らないです)

渡しているURLが、URLらし過ぎる(変な表現w)のが原因ではないかと思います。

切り取られてしまった「&」から後は、
「短縮したいURLの一部」ではなく、「bitlyのapiに渡しているパラメータ」として扱われているのでしょう。

bitlyのapiに渡す前に、「短縮したいURL」をまるごとURLエンコードしてみてはどうでしょうか。


stshishoさんのコードと指南をそのまま流用させていただきますと

下記の場所が良いようですよ!

/** * Returns a shortened URL of the input. * * @param {string} longUrl The long URL to shorten. * @return The shortened url. */ function shortenUrl(longUrl) { try { var regexp = /^(https?|ftp)(://[-_.!~*\'()a-zA-Z0-9;/?:\@&=+$,%#]+)$/; if (typeof longUrl != 'string' || !regexp.test(longUrl)) throw new Error('Invalid args'); longUrl = Utilities.base64EncodeWebSafe(longUrl); //ここ★ var response = BitlyUrlShortenerService(longUrl); return response.data.url; } catch(e) { return e.toString(); } }

投稿2018/04/18 06:21

編集2018/04/18 09:18
mix-peach

総合スコア1910

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/04/18 08:16

横から失礼いたします。 mix-peachさんがおっしゃられている通りかと思います。 提示された shortenUrl() 中、BitlyUrlShortenerService() へ渡す直前にでも、以下のようにURLエンコードすれば良いと思います。 longUrl = Utilities.base64EncodeWebSafe(longUrl);
tackt1107

2018/04/18 09:06

お二方、ご回答ありがとうございます!大変勉強になりました!たしかにエンコードしたURLだと美味く短縮できました! ただ、当方GASが初心者でして、大変恐れ入りますが、ご教示いただいたコードをどの位置に入れるといいのかがわからずでして、もし可能でしたら、そちらもご教示いただけますでしょうか?
tackt1107

2018/04/18 09:33

ありがとうございます!!解決できました!本当に助かりました!
退会済みユーザー

退会済みユーザー

2018/04/18 14:29

何よりです。 > mix-peachさん 補足ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問