5 мин чтенияИнженерия

Как сократить URL в Excel: четыре рабочих способа

Формула WEBSERVICE в Excel не может отправлять POST-запросы, поэтому для сокращения ссылок нужны Office Scripts, Power Automate или массовый импорт. Какой способ подходит для вашей частоты запуска таблицы.

Marius Voß
DevRel · edge infra
Как сократить URL в Excel: формула WEBSERVICE, ограниченная GET-запросами, рядом со способами через Office Scripts и Power Automate, которые поддерживают POST

Excel не может сократить URL с помощью формулы. WEBSERVICE отправляет GET-запрос без заголовков и тела, а современному API сокращателя нужен POST с заголовком Authorization и JSON. К тому же эта функция работает только в Windows. Любое найденное вами руководство по сокращению ссылок формулой построено на сервисе, который принимал длинный URL как параметр запроса, а такие сервисы исчезли.

Поэтому настоящий вопрос заключается в том, какой из трех рабочих способов подходит для вашей таблицы: Office Script, поток Power Automate или массовый импорт с копированием и вставкой. Ответ почти полностью зависит от того, как часто должна запускаться таблица.

Четыре способа добавить короткие ссылки в таблицу Excel и ограничение каждого: формула WEBSERVICE, Office Scripts, действие HTTP в Power Automate и массовый импорт

Способ первый: Office Script

Office Scripts выполняют TypeScript для рабочей книги и могут вызывать внешний API с помощью fetch. Этот способ подходит для таблицы, которую вы открываете и запускаете вручную.

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);
  }
}

Есть три ограничения, которые проявляются одно за другим.

Главное: внешние вызовы fetch работают, когда скрипт запускается в Excel, и не работают, когда его запускает Power Automate. Скрипт, который идеально работает из вкладки Automate, завершается ошибкой fetch is not defined, как только его запускает поток, и из-за этой неожиданности многие теряют целый рабочий день.

Хранилища секретов и потока OAuth нет, поэтому ключ хранится в скрипте или ячейке. Чтение ключа с листа Config, как показано выше, немного безопаснее: скриптом можно поделиться без ключа, но сама рабочая книга теперь становится учетными данными.

Кроме того, целевой API должен разрешать вызов из источника скрипта. В документации Office Scripts указано требование CORS для внешних ресурсов. Большинство публичных API ему соответствует, а некоторые внутренние - нет.

Именно строка if (rows[i][1]) continue позволяет безопасно запустить скрипт дважды: строки, в которых уже есть короткая ссылка, пропускаются, а ключ идемпотентности защищает остальные.

Способ второй: поток Power Automate

Для всего, что выполняется по расписанию, поток - правильный ответ, потому что он работает независимо от того, открыта ли у кого-нибудь рабочая книга.

Схема такова: триггер повторения или файла, действие List rows present in a table из коннектора Excel, цикл apply-to-each с действием HTTP, отправляющим запрос к endpoint ссылок, а затем действие Update a row, записывающее короткую ссылку обратно.

Перед настройкой нужно знать две вещи. Универсальное действие HTTP относится к премиум-коннекторам, поэтому этот способ зависит от вашей лицензии, а не от навыков. Кроме того, поток может хранить ключ API в защищенном вводе или получать его из Azure Key Vault. Это заметное улучшение по сравнению с Office Script: учетные данные больше не лежат в файле, который люди пересылают друг другу по электронной почте.

Если поток будет обрабатывать сотни строк, установите ограничение параллелизма для apply-to-each. Стандартная степень распараллеливания достаточно велика, чтобы упереться в ограничение частоты API, а исправление требует одной настройки, а не переработки всей схемы.

Способ третий: экспорт, массовый импорт, вставка обратно

Попытка сократить ссылки формулой Excel в сравнении со скриптовым конвейером: только GET в WEBSERVICE против настоящего POST с заголовками и идемпотентностью

Для разовой задачи этот способ быстрее двух предыдущих по времени до результата. Экспортируйте столбец с URL назначения в CSV, обработайте его массовым импортом сокращателя, скачайте результат и вставьте короткие ссылки рядом с исходными.

Никакого премиум-коннектора, ключа в рабочей книге и скрипта, который нужно поддерживать. В руководстве по массовому импорту из Google Sheets описан формат файла, одинаковый независимо от того, какая таблица его создала, а в материале массовая генерация QR-кодов описан вариант, где для каждой строки также нужен код для печати.

Правило выбора простое. Один раз - вставка. Каждый понедельник - поток. При каждом открытии рабочей книги - Office Script.

Хотите сначала попробовать способ с вставкой? Создайте аккаунт на бесплатном плане, импортируйте CSV из пяти строк и проверьте, стоит ли вообще создавать автоматизацию.

Почему формула всё равно не подойдёт

Предположим, WEBSERVICE умела бы отправлять POST. Это всё равно был бы неподходящий инструмент, потому что формулы пересчитываются по расписанию Excel, а не по вашему. Откройте рабочую книгу, и каждая строка снова отправит запрос. Без ключа идемпотентности при каждом открытии для каждой строки будет создана дублирующая ссылка; с ним это будет лишь всплеск бессмысленного трафика, расходующий ваш лимит запросов.

Всё, что создаёт ресурс, должно находиться в коде, который запускается по вашей команде, а не в ячейке, пересчитываемой тогда, когда приложение сочтёт нужным. Это полезно помнить и за пределами данного случая: по той же причине люди обжигаются, помещая RAND() или NOW() в таблицу, которая служит источником данных для отчета.

Как вернуть результат в таблицу

Какой бы способ вы ни выбрали, создайте четыре столбца, а не два: исходный URL, короткую ссылку, слаг и сообщение о статусе или ошибке. Тогда незавершенный запуск будет очевиден и его можно будет повторить, вместо того чтобы получать столбец с незаметными пропусками.

Сохраните файл. Через три месяца, когда кто-нибудь спросит, какая ссылка попала в какую рассылку, ответом будет таблица, а восстановление данных из дашборда займёт больше времени, чем её сохранение. Если для этих же ссылок нужны данные о кликах, в материале как отслеживать клики по ссылкам описана часть, посвященная экспорту.

Читайте серию статей-основ

Эта статья входит в кластер engineering. Начните с руководства по бесплатному API сокращателя URL, чтобы разобраться со структурой запроса, затем изучите ограничения частоты и идемпотентность, чтобы корректно работать в цикле. Версию той же задачи с CSV для PowerShell смотрите в статье как сократить URL в PowerShell.

Другие статьи в блоге

Частые вопросы

Можно ли сократить URL формулой Excel?

Не с современным API сокращателя. WEBSERVICE отправляет GET-запрос без заголовков, поэтому не может пройти аутентификацию или отправить тело JSON, к тому же работает только в Windows. Любое руководство по сокращению ссылок формулой основано на старом сервисе, который принимал длинный URL как параметр запроса. Такие сервисы исчезли.

Как тогда сократить URL в Excel?

Работают три способа: Office Script с fetch для разового запуска внутри приложения, поток Power Automate с действием HTTP для всего, что выполняется по расписанию, или экспорт столбца в CSV и массовый импорт. Выбирайте способ по тому, как часто должна запускаться таблица, а не по тому, какой вариант выглядит самым хитроумным.

Почему fetch не работает в моем Office Script, когда его запускает Power Automate?

Потому что внешние вызовы fetch недоступны в среде выполнения Power Automate и работают только при запуске скрипта непосредственно в Excel. Скрипт, который работает из вкладки Automate в приложении, завершается ошибкой `fetch is not defined`, когда его запускает поток. Это самая частая неожиданность в таком сценарии.

Поддерживает ли Office Scripts OAuth или хранение секретов?

Нет. В нём нет потока входа и хранилища секретов, поэтому ключ придётся жёстко прописать в скрипте или читать из ячейки. Считайте любую книгу с таким скриптом учетными данными: не делитесь ею без необходимости и используйте ключ с областью действия, ограниченной созданием ссылок.

Как не создавать дубликаты ссылок при каждом пересчете таблицы?

Отправляйте ключ идемпотентности, полученный из URL назначения, чтобы повторный запрос возвращал существующую ссылку, а не создавал новую. Именно поэтому формула была бы неподходящим инструментом, даже если бы умела отправлять POST: формулы пересчитываются по собственному расписанию и каждый раз создавали бы новые ссылки.

Как быстрее всего один раз сократить несколько сотен строк?

Экспортируйте столбец в CSV и используйте массовый импорт сокращателя, затем вставьте полученные короткие ссылки рядом с исходными. Никакого кода и премиум-коннектора, всего несколько минут работы. Автоматизируйте процесс только тогда, когда одно и то же задание повторяется по расписанию.

Попробуйте Elido

Вставьте URL - получите короткую ссылку

Без регистрации. Ссылка живёт 30 дней. Зарегистрируйтесь, чтобы оставить её навсегда.

Бесплатно, без регистрации · 2 в день

Попробуйте Elido

URL-сокращатель с хостингом в ЕС: собственные домены, глубокая аналитика, открытый API. Бесплатный тариф - без банковской карты.

Теги
how to shorten urls in excel
excel url shortener
webservice function excel
office scripts fetch api
power automate http request
bulk shorten urls spreadsheet

Читать дальше