2分で読了チュートリアル

一括URL短縮: Googleスプレッドシートからリンクを取り込む

Googleスプレッドシートから1バッチ最大100本のリンクを短縮。ダッシュボードへの貼り付けやCSV。

Ana Kowalska
Marketing solutions engineering

Elidoの一括インポートは、url, slug, titleの行のリストから、1バッチあたり最大100本の短縮リンクを作成します。Googleスプレッドシートの行をダッシュボードに貼り付けるか、CSVとしてアップロードするか、Apps Scriptから一括APIを呼び出せます。UTMタグは独立したインポート列ではありません。最終的なタグ付きURLをシートで作ると、Elidoはそれを行き先として保存します。

これは一部のチュートリアル(この記事の以前のバージョンを含む)が約束していた内容より狭いため、この記事ではコードが今日実際に行うことだけに絞っています。ドライランモード、競合時のスキップフラグ、10,000行のアップロードを求めて来た方へ。これらはまだ存在せず、計画中の作業として追跡されており、以下でもそのように明記しています。

UTM全体の話は、UTM追跡のコーナーストーン記事がテンプレートとサーバーサイドのコンバージョン転送を扱っています。この記事は、シートから短縮リンクまでの部分です。

要点

  • キャンペーンごとに1つのシート。列はfinal_url(UTM込みで数式で作成)、slug、title。
  • ダッシュボードの手順: New linkを開き、Bulkタブ(貼り付け)またはCSVタブ(アップロード)を選びます。どちらも1バッチ100本です。
  • APIの手順: 最大100項目のJSON本文でPOST /v1/links/bulkを呼びます。項目はdestination_url、slug、title、tagsを受け取ります。
  • 各行は個別に成功または失敗します。使用済みのスラッグは、その行だけが失敗します。
  • ドライランはまだありません(計画中)。代わりに、最初のバッチのあとで数行を確認してください。
CSV タブを開いた Elido の「リンクをインポート」ダイアログ。スプレッドシートのエクスポートをアップロードして、最大 100 件の短縮リンクを一度に作成する

シートを作る

Elidoはリンクごとに3つのものを読み取ります。行き先、スラッグ、タイトルです。作業用の列は左側に置き、出力の列は右側に1つ置いてください。

列Elidoが使用備考
base_urlいいえ整ったランディングページのURL
utm_source, utm_medium, utm_campaignいいえ数式へのシート専用の入力
final_urlはい(行き先)数式で作成。下記参照
slugはい(任意)空欄ならElidoが生成します
titleはい(任意)ダッシュボードのリンク一覧に表示されるラベル
short_linkいいえインポート後に入力

final_urlの数式は、Elidoが行わないUTMの作業を担います。

=TRIM(A2) & IF(ISNUMBER(FIND("?", A2)), "&", "?")
  & "utm_source=" & ENCODEURL(B2)
  & "&utm_medium=" & ENCODEURL(C2)
  & "&utm_campaign=" & ENCODEURL(D2)

これをシートで行うことには、副次的な利点があります。レビューした行き先が、そのまま公開される行き先になるのです。あとから書き換えられるものはなく、すでに?を含む行き先は、壊れることなく&で延長されます。

Google自身のガイダンスでは、URLにタグを付けるときは必ずutm_source、utm_medium、utm_campaignを設定するよう勧めています。これらがないと、レポートに「(not set)」と表示されます(Googleアナリティクスヘルプ、2026-10-09に確認)。=IF(OR(B2="",C2="",D2=""),"missing UTM","ok")のようなチェック列を追加し、エクスポートの前にそれで絞り込んでください。他のツールが出すドライランの警告の代わりになります。

手順1: ダッシュボードに貼り付ける(Bulkタブ)

New linkを開いてBulkに切り替えます。テキストエリアは、1行に1本のリンクを受け取ります。

https://shop.example/de?utm_source=newsletter&utm_medium=email&utm_campaign=q2-spring, q2-hero-de, Hero DE
https://shop.example/fr?utm_source=newsletter&utm_medium=email&utm_campaign=q2-spring, q2-hero-fr, Hero FR

パーサーは各行をカンマで分割します。最初の部分がURL、2番目がスラッグ、それ以降はすべてタイトルです。空行と#で始まる行は無視されます。シートの扱いには、2つの注意点があります。

  • 行き先URLの中のカンマは、その行を壊します。 UTMの値にカンマが含まれる場合は、%2Cにエンコードしてください(上の数式のENCODEURLがすでにそうしています)。
  • スプレッドシートからの貼り付けは、カンマではなくタブ区切りのセルになります。 補助列に1行ごとのカンマ区切りの文字列、たとえば=E2 & ", " & F2 & ", " & G2を作り、その1列だけをコピーしてください。

インポートのあと、ダイアログに作成された本数と失敗した本数が表示され、失敗した各行とその理由は下で展開できます。

一括インポート後に、作成された短縮リンクとその行き先が並ぶElidoダッシュボードのリンク一覧

手順2: CSVアップロード(CSVタブ)

シートをCSVとしてダウンロードし(ファイル、ダウンロード、カンマ区切りの値)、列をurl, slug, titleの順にして、CSVタブにアップロードします。ファイルはブラウザー内で読み込まれ、貼り付けタブと同じ100本のバッチで送られます。最初の行がhttpで始まっていなければ、ヘッダーとして扱われ、除外されます。

CSVリーダーは単純なカンマ分割であり、完全なCSVパーサーではありません。カンマを含む引用符付きのフィールドは解釈されないため、タイトルにカンマを含めないでください。含めるとタイトルが途中で切れます。100行を超える場合は、ファイルを100行ずつに分割してください。

企画書がExcelにある場合は、ExcelでURLを短縮する方法がそちらの手段を扱っています。

手順3: Apps ScriptからのAPI

1週間かけて埋まっていくシートには、APIを呼び出します。エンドポイントはPOST https://api.elido.app/v1/links/bulkです。トークンは個人用アクセストークンまたはワークスペースAPIキーで、Authorization: Bearer ...として送り、ワークスペースに紐づいたキーなら、呼び出しでworkspace_idとdomain_idを省略できます(ワークスペースの既定のドメインが使われます)。認証はAPIドキュメントのAuthenticationに記載されています。

curl -X POST https://api.elido.app/v1/links/bulk \
  -H "Authorization: Bearer $ELIDO_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "links": [
      { "destination_url": "https://shop.example/de?utm_source=newsletter&utm_medium=email&utm_campaign=q2-spring",
        "slug": "q2-hero-de", "title": "Hero DE", "tags": ["q2-spring", "email"] }
    ]
  }'

レスポンスはok、failed、そして入力行ごとに1項目を順番に並べたitems配列を返し、各項目にokかerrorが付きます。すでに使われているスラッグは、その行だけがslug already exists for this domainを返します。Idempotency-Keyヘッダーは24時間有効です。同じキーと同じ本文なら、リンクを二重に作らず、最初のレスポンスを再生します(APIドキュメントのIdempotencyを参照)。

作成されたリンクはすべて、非同期の安全性スキャンのキューにも入るため、一括インポートがスキャナーを待つことはありません。

// Google Apps Script: send new sheet rows to Elido's bulk endpoint.
// Trigger: time-driven, hourly. Batches of 100 (the API maximum).
function importNewLinks() {
  const sheet =
    SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Q2 Spring");
  const data = sheet.getDataRange().getValues();
  const h = data[0];
  const urlCol = h.indexOf("final_url");
  const slugCol = h.indexOf("slug");
  const titleCol = h.indexOf("title");
  const doneCol = h.indexOf("short_link");

  const pending = [];
  for (let i = 1; i < data.length && pending.length < 100; i++) {
    if (data[i][urlCol] && !data[i][doneCol]) pending.push(i);
  }
  if (!pending.length) return;

  const links = pending.map((i) => ({
    destination_url: data[i][urlCol],
    slug: data[i][slugCol] || undefined,
    title: data[i][titleCol] || undefined,
  }));

  const resp = UrlFetchApp.fetch("https://api.elido.app/v1/links/bulk", {
    method: "post",
    contentType: "application/json",
    headers: {
      Authorization:
        "Bearer " +
        PropertiesService.getScriptProperties().getProperty("ELIDO_TOKEN"),
    },
    payload: JSON.stringify({ links }),
    muteHttpExceptions: true,
  });
  if (resp.getResponseCode() !== 200) {
    console.error(resp.getContentText());
    return;
  }

  JSON.parse(resp.getContentText()).items.forEach((item) => {
    const row = pending[item.index] + 1;
    const cell = sheet.getRange(row, doneCol + 1);
    cell.setValue(
      item.status === "ok" ? item.link.slug : "ERROR: " + item.error,
    );
  });
}

スクリプトについての補足です。

  • 書き戻すのは完全なURLではなく、スラッグ(またはエラーテキスト)です。クリックできるリンクにしたい場合は、数式の列で自分の短縮ドメインを先頭に付けてください。short_linkにエラーテキストがある行は次回の実行でスキップされるため、スラッグを直したらそのセルを消去してください。
  • トークンは、コードではなくスクリプトのプロパティに保管してください。
  • 個人アカウントのApps Scriptの制限は、1日20,000回のURL Fetch呼び出し、1回の実行につき6分、1日あたりトリガーの実行時間90分です(Workspaceアカウント: 100,000回、6時間)(Apps Scriptのクォータ、2026-10-09に確認)。1回の呼び出しで100本を送る1時間ごとのジョブは、これをはるかに下回ります。
  • Elido側のAPIレート制限が、トークンごとおよびワークスペースごとにそれに加えて適用されます。APIドキュメントのRate Limitsを参照してください。
一括でインポートしたリンクがキャンペーンごとにまとめられているElidoのキャンペーンページ

スラッグとタグ

スラッグ。 キャンペーンのスラッグには接頭辞(q2-、jun26-)を付けて、古いリンクと衝突しないようにしてください。衝突は行ごとに報告され、バッチの残りは通るため、同じシートを再実行しても、すでに存在する行は重複せずエラーが返ります。スラッグを空欄にすると、Elidoが生成します。

タグ。 ダッシュボードのBulkタブとCSVタブではタグを設定できません。APIではtags配列で設定できます。タグは単なる文字列なので、dimension:valueという規則(channel:email)はあくまで命名の習慣で、シート側で、たとえば="channel:"&C2のようにして徹底します。キャンペーンがクリックをどうまとめるかは、キャンペーン機能をご覧ください。

まだ作られていないもの

以下は、この記事の以前のバージョンで説明していたもので、現時点では製品に存在しません。

  • コミット前に、解決後のリンクと競合を確認するドライランプレビュー。計画中です。
  • 既存スラッグに対する競合モード(スキップ、失敗、置き換え)。計画中です。現状では、使用済みのスラッグは行ごとのエラーです。
  • インポート中に適用されるUTM列とワークスペースのUTMテンプレート。計画中です。上記のシートの数式を使ってください。
  • より大きなバッチ(10,000行)と、状態報告付きの非同期アップロード。計画中です。上限は1リクエストあたり100本です。
  • ダッシュボードのインポートタブでの直接のタグ指定。計画中です。

ドライランができるまでは、リンクを公開する前に、最初のバッチの最初の行と最後の行をダッシュボードで抜き取り確認してください。

次のステップ

まず、ブランド短縮リンクの設定で既定のドメインとブランドを設定してください。クリック後の計測については、サーバーサイドのコンバージョン計測が、MetaとGA4へのコンバージョン転送の仕組みを扱っています。ただしElido自体は、購入をまだそれらに転送しません。マーケターのワークフロー全体はマーケター向けソリューションとキャンペーン機能にあります。

ブログの関連記事

よくある質問

Elidoでは一度に何本のリンクを短縮できますか?

1バッチあたり100本です。ダッシュボードのBulkタブとCSVタブでも、POST /links/bulk のAPI呼び出しでも同じです。それより大きいシートは100本ずつのバッチに分割します。各行は個別に処理されるため、不正な行が1つあってもバッチ全体は失敗しません。

Elidoの一括インポートはどの列を読み取りますか?

ダッシュボードでは、リンクごとに1行で、url、slug、titleの順です。slugとtitleは任意です。APIでは、各項目にtagsの配列も指定できます。UTMの列はありません。タグ付きのURLは、先にシートで作ってください。

Elidoの一括インポートにはドライランがありますか?

ありません。現時点でプレビューモードはなく、すでに存在するスラッグをスキップしたり置き換えたりするオプションもありません。使用済みのスラッグは、その行だけのエラーとして返されます。バックログに計画済みとして載っています。

スラッグがすでに存在するとどうなりますか?

その行はステータスerrorとメッセージ slug already exists for this domain を返し、ほかのすべての行は作成されます。スラッグを直して、失敗した行だけをもう一度インポートしてください。

Apps Scriptから一括APIを定期的に呼び出せますか?

はい。時間主導型トリガーで、短縮リンクのない行を読み取り、UrlFetchAppで一括エンドポイントにPOSTし、スラッグを書き戻せます。Googleのクォータは、個人アカウントで1日20,000回のURL Fetch呼び出しで、100本ずつの1時間ごとのバッチに必要な量をはるかに上回ります。

UTMパラメーターはシートに入れるべきですか、短縮サービスに入れるべきですか?

シートです。Elidoの一括インポートは行き先を指定されたとおりに保存するため、各URLにutm_source、utm_medium、utm_campaignを付け足す数式を使えば、リンクが存在する前にレビューと監査ができる行き先が得られます。

Elidoを試す

URLを貼り付けて短縮リンクを取得

登録不要。リンクは30日間有効。永久に保存するには登録してください。

登録不要。無料登録すると月 50 件のリンクを作成できます。

Elidoを試す

EUホスティングのURL短縮サービス。カスタムドメイン、詳細な分析、オープンAPI付き。無料プラン - クレジットカード不要。

タグ
bulk url shortener
csv import short links
sheets to short links
bulk link creation
campaign url shortener
google sheets automation

続きを読む