Excelでは数式でURLを短縮できません。WEBSERVICEはヘッダーもボディもないGETリクエストを送信しますが、最新の短縮サービスAPIにはAuthorizationヘッダーとJSONを付けたPOSTが必要です。しかもWindows専用です。見つかる数式ベースのチュートリアルは、長いURLをクエリパラメーターとして受け付けていたサービスを前提にしており、そうしたサービスはなくなっています。
つまり本当の問題は、シートに適した3つの手段のどれを選ぶかです。Office Script、Power Automateフロー、それともコピー&ペーストを使う一括インポートか。答えは、ほぼ全面的にシートを実行する頻度で決まります。
方法1:Office Script
Office Scriptsはブックに対してTypeScriptを実行し、fetchで外部APIを呼び出せます。シートを開いて手動で実行する場合の方法です。
async function main(workbook: ExcelScript.Workbook) {
const sheet = workbook.getActiveWorksheet();
const rows = sheet.getUsedRange().getValues();
for (let i = 1; i < rows.length; i++) {
const destination = String(rows[i][0]);
if (!destination || rows[i][1]) continue; // skip blanks and already-done rows
const response = await fetch("https://api.elido.app/v1/links", {
method: "POST",
headers: {
Authorization:
"Bearer " + workbook.getWorksheet("Config").getRange("B1").getText(),
"Content-Type": "application/json",
"Idempotency-Key": destination, // stable per row, so a re-run creates nothing
},
body: JSON.stringify({ destination_url: destination }),
});
const link = (await response.json()) as { short_url: string };
sheet.getCell(i, 1).setValue(link.short_url);
}
}
順番に見ておきたい、影響の大きい制約が3つあります。
最大のポイントは、外部へのfetch呼び出しがExcelでスクリプトを実行したときには動く一方、Power Automateが実行すると動かないことです。Automateタブから完全に動くスクリプトでも、フローが起動した瞬間にfetch is not definedで失敗します。この意外な挙動で午後を丸ごと費やす人が少なくありません。
シークレット保存もOAuthフローもないため、キーはスクリプトかセルに置くことになります。上の例のようにConfigシートから読み取れば、キーなしでスクリプトを共有できる分だけ少し安全ですが、今度はブック自体が認証情報になります。
また、対象APIはスクリプトのオリジンからの呼び出しを許可しなければなりません。Office Scriptsのドキュメントでは外部リソースに対するCORS要件が説明されています。多くの公開APIは満たしますが、社内APIには満たさないものもあります。
if (rows[i][1]) continueの行が、スクリプトを2回実行しても安全にする部分です。すでにショートリンクがある行はスキップされ、残りの行はべき等性キーで保護されます。
方法2:Power Automateフロー
スケジュールで実行するものなら、フローが正直な答えです。誰もブックを開いていなくても実行されるためです。
形としては、繰り返しまたはファイルトリガー、ExcelコネクタのList rows present in a table、HTTPアクションでリンクエンドポイントにPOSTするApply to each、そしてショートリンクを書き戻すUpdate a rowです。
構築前に知っておくべきことが2つあります。汎用のHTTPアクションはプレミアムコネクタなので、この方法はスキルではなくライセンスに左右されます。また、フローはAPIキーをセキュアな入力に保存するか、Azure Key Vaultから取得できます。これはOffice Scriptより本質的に改善されています。認証情報が、人々がメールでやり取りするファイルに残らなくなるためです。
フローで数百行を処理するなら、Apply to eachに同時実行数の上限を追加してください。既定の同時実行数はAPIのレート制限にかかるほど大きくなることがあり、修正は設計変更ではなく1つの設定で済みます。
方法3:書き出し、一括インポート、貼り戻し
一度だけ実行するなら、完了までの時間では上の2つより優れています。遷移先の列をCSVに書き出し、短縮サービスの一括インポートにかけ、結果をダウンロードして、ショートリンクを元の列の隣に貼り付けます。
プレミアムコネクタも、ブック内のキーも、保守するスクリプトも不要です。Google Sheetsの一括インポートガイドでは、どのスプレッドシートで作成したファイルでも同じファイル形式を扱っており、一括QRコード生成では各行に印刷可能なコードも必要な場合の方法を説明しています。
判断基準は簡単です。一度だけなら貼り付け。毎週月曜日ならフロー。誰かがブックを開くたびに実行するならOffice Scriptです。
まず貼り付ける方法を試してみませんか。無料プランでアカウントを作成し、5行のCSVをインポートして、自動化を構築する価値があるかどうかを確認してください。
数式がやはり不適切な理由
仮にWEBSERVICEがPOSTできたとしても、数式はあなたの都合ではなくExcelのスケジュールで再計算されるため、やはり不適切なツールです。ブックを開くと、すべての行がもう一度リクエストを送ります。べき等性キーがなければ、開くたびに行ごとの重複リンクが発行されます。キーがあっても、レート制限を消費するだけの無意味な通信が一斉に発生します。
リソースを作成する処理は、アプリケーションの気分で再計算されるセルではなく、あなたが指示したときに実行されるコードに置くべきです。この考え方は今回に限りません。レポートの元になるシートにRAND()やNOW()を入れて痛い目を見るのと同じ理由です。
結果をシートに戻す
どの方法を選んでも、2列ではなく4列を書き出してください。元のURL、ショートリンク、スラッグ、そしてステータスまたはエラーメッセージです。そうすれば途中で止まった実行もすぐ分かり、再実行できます。無言の空白がある列になることもありません。
ファイルは残しておきましょう。3か月後に、どのメーリングにどのリンクを入れたのか聞かれたとき、そのシートが答えになります。ダッシュボードから作り直すより、保存しておく方が手間がかかりません。同じリンクのクリックデータも隣に置く必要があるなら、リンククリックを追跡する方法で書き出し側を説明しています。
基礎シリーズを読む
この記事はengineeringクラスターに含まれます。まずリクエストの形を無料URL短縮サービスAPIガイドで確認し、ループ内で適切に動作させる方法をレート制限とべき等性で学んでください。同じCSV処理をPowerShellで行う場合は、Invoke-RestMethodでURLを短縮する方法をご覧ください。
ブログの関連記事
よくある質問
Excelの数式でURLを短縮できますか?
最新の短縮サービスAPIではできません。WEBSERVICEはヘッダーなしのGETリクエストを送信するため、認証もJSONボディの送信もできず、Windows専用です。数式ベースの短縮方法を紹介するチュートリアルは、長いURLをクエリパラメーターとして受け付けていた古いサービスを使っています。
では、ExcelでURLを短縮するにはどうすればよいですか?
3つの方法があります。アプリ内で一度だけ実行するならfetchを使うOffice Script、スケジュール実行ならHTTPアクションを使うPower Automateフロー、または列をCSVに書き出して一括インポートする方法です。最も巧妙に見える方法ではなく、シートを実行する頻度で選んでください。
Power AutomateからOffice Scriptを実行するとfetchが失敗するのはなぜですか?
外部へのfetch呼び出しは、スクリプトをExcel自体で実行したときだけ利用でき、Power Automateのランタイムでは利用できないためです。アプリのAutomateタブから正常に動くスクリプトも、フローから起動するとfetch is not definedで失敗します。これはここで最もよくある意外な落とし穴です。
Office ScriptsはOAuthやシークレット保存に対応していますか?
いいえ。サインインフローもシークレットストアもないため、キーをスクリプトにハードコードするか、セルから読み取る必要があります。そのスクリプトを含むブックは認証情報として扱ってください。広く共有せず、リンク作成に限定したキーを使います。
シートが再計算されるたびに重複リンクが作成されるのを防ぐにはどうすればよいですか?
遷移先URLから作ったべき等性キーを送信してください。そうすれば、繰り返しのリクエストは新しいリンクではなく既存のリンクを返します。数式がPOSTできたとしても不適切なツールになる理由もここにあります。数式は独自のスケジュールで再計算され、そのたびにリンクを発行するためです。
数百行を一度だけ短縮する最速の方法は何ですか?
列をCSVに書き出して短縮サービスの一括インポートを使い、返された短縮リンクを元の列の隣に貼り付けます。コードもプレミアムコネクタも不要で、数分で完了します。同じ作業をスケジュールで繰り返す場合だけ自動化してください。
Elidoを試す
URLを貼り付けて短縮リンクを取得
登録不要。リンクは30日間有効。永久に保存するには登録してください。
Free、登録不要 · 1日あたり2件