Получение курсов валют в Google Sheets

Получение курсов валют в Google Sheets

Michael Smirnov

Правильный канал о Таблицах (Google Sheets): @google_sheets

Чат канала: @google_spreadsheets_chat


Здравствуйте, товарищи!


Часто спрашивают в чате, как получить курсы валют в Google Sheets? Разберём несколько подходов на простых примерах.


Сходу - таблица с примерами (делайте копию), далее - описание.


⚠️ Внимание! Увага! Назар аударыңыз! 注意!توجه! ⚠️

На текущий момент данные Национального банка Республики Беларусь описанным ниже методом получить не удаётся. Предположительно, они закрылись от гугловских IP (с которых идут запросы, когда вы пишите формулы импорта), а, может, и не только от гугловских, но от всего Запада (из России всё доступно).

Почему и зачем они это сделали, не очень понятно. Может, мы с вами слишком часто курсы валют запрашивали? А, может, не работает совсем по другой причине.

Получить данные пробовали и скриптом, результат такой же: не получилось, вылетело по timeout или с бессмысленными капризами "ой, нас DDoS'ят!!! памагити!!!".


Проблемы эти наблюдаются с 27.03.2022 (добрые люди обратили наше внимание) и на сегодняшний день (14.03.2024) никуда они не делись.


ЦБ РФ тоже временно не работал с табличками (примерно с марта 2023), но отпустило. 18.07.2023 всё было ок.


Потом клоуны из ЦБ РФ опять закрыли доступ. С 2024-03-14 (или раньше) снова нельзя формулами забрать данные.

⚠️ Внимание! Увага! Назар аударыңыз! 注意!توجه! ⚠️


Google Finance


Функция GOOGLEFINANCE() (документация) берёт данные с Google Finance, где, например, можно посмотреть курс доллара в рублях по ссылке:

https://www.google.com/finance/quote/USD-RUB

Или наоборот, курс рубля в долларах:

https://www.google.com/finance/quote/RUB-USD


Данные, которые возвращает GOOGLEFINANCE(), обновляются примерно каждые 20 минут.

Хоть данные и не с потолка берутся, Google советует к ним относиться с аккуратностью, носят чисто информационных характер, не использовать для торговли, не считать рекомендациями и пр.


Получение текущего курса USD в рублях:

=GOOGLEFINANCE("CURRENCY:USDRUB")

Результат:

73,4836


Получение курса, который был неделю назад:

=GOOGLEFINANCE("CURRENCY:USDRUB"; "price"; TODAY() - 7)

Результат:

| Date                | Close   |
|---------------------|---------|
| 18.05.2021 23:58:00 | 73,6974 |


Получение курсов за прошлые 7 дней:

=GOOGLEFINANCE("CURRENCY:USDRUB"; "price"; TODAY() - 7; 7)

Результат:

| Date                | Close   |
|---------------------|---------|
| 18.05.2021 23:58:00 | 73,6974 |
| 19.05.2021 23:58:00 | 73,7663 |
| 20.05.2021 23:58:00 | 73,4719 |
| 21.05.2021 23:58:00 | 73,641  |
| 22.05.2021 23:58:00 | 73,6226 |
| 23.05.2021 23:58:00 | 73,6478 |
| 24.05.2021 23:58:00 | 73,4738 |


Примеры использования GOOGLEFINANCE()


В таблице есть примеры вызовов GOOGLEFINANCE(), которые мне непонятны. Если знаете, что они возвращают, напишите в чате.


Официальные курсы ЦБ РФ, НБУ и НБ РБ


Посмотреть курсы валют в российских рублях на заданную дату, которые устанавливает ЦБ РФ, можно на сайте. Например, по ссылке, которую легко составить в Google Sheets, можно получить курсы валют на 25.05.2021:

https://www.cbr.ru/currency_base/daily/?UniDbQuery.Posted=True&UniDbQuery.To=25.05.2021


Данные со страницы можно вытащить с помощью IMPORTHTML(), но мы так делать не будем - есть метод получше.


ЦБ РФ предоставляет данные в виде XML (описание). Они менее нагружены, чем HTML страницы, ничего лишнего - будут быстрее загружаться, легче будет разбирать.


Тут нам поможет функция IMPORTXML() (документация) и небольшие знания XPath (tutorial).


ЦБ РФ - Справочник по валютам


Тут у ЦБ РФ справочник по валютам:

https://www.cbr.ru/scripts/XML_valFull.asp


С помощью следующей формулы достаём все поля этого справочника. Первой колонкой атрибут ID элементов <Item> (одна из валют) - xpath //Item/@ID, последующие колонки - все подэлементы каждого <Item> - xpath //Item.

={
  "ID"\ "Name"\ "EngName"\ "Nominal"\ "ParentCode"\ "ISO_Num_Code"\ "ISO_Char_Code";
  IMPORTXML("https://www.cbr.ru/scripts/XML_valFull.asp"; "//Item/@ID")\
  IMPORTXML("https://www.cbr.ru/scripts/XML_valFull.asp"; "//Item")
}


Достаём справочник по валютам: названия и коды


ЦБ РФ - Курсы валют на заданную дату


По этой ссылке можно получить курсы валют на заданную дату (для другой даты достаточно соответственно поменять конце строки):

https://www.cbr.ru/scripts/XML_daily.asp?date_req=25/05/2021


Обратите внимание на поле Nominal. Чаще всего это 1 (например, 73,5266 Российских рублей за 1 доллар США), но бывает больше (например, 17,1809 Российских рублей за 100 Казахстанских тенге). Для получения курса за 1 единицу валюты, значение элемента <Value> надо разделить на значение элемента <Nominal>.


Отсюда формула. Первая колонка - элемент <CharCode> (полученный курс надо будет где-то использовать, найти его сможем, например, по CharCode), вторая - курс.


В ячейке A6 мы подготовим URL:

="http://www.cbr.ru/scripts/XML_daily.asp?date_req=" & TEXT(DATE(2021; 5; 25); "dd/mm/yyyy")

Итоговая формула:

={
  "CharCode"\ "Курс";
  IMPORTXML(A6; "//CharCode")\
  ARRAYFORMULA(
      IMPORTXML(A6; "//Value") / IMPORTXML(A6;  "//Nominal")
  )
}


Курсы валют в Российских рублях на 25.05.2021


ЦБ РФ - Значения курса валюты за период


По этой ссылке можно получить курс доллара США за предыдущие 7 дней:

https://www.cbr.ru/scripts/XML_dynamic.asp?date_req1=18/05/2021&date_req2=24/05/2021&VAL_NM_RQ=R01235


С датами, думаю, всё понятно. Только стоит помнить, что курс на воскресенье и понедельник (они отсутствуют в выдаче) равен субботнему курсу, он устанавливается в пятницу и на выходных не меняется.


Параметр в ссылке VAL_NM_RQ - это внутренний ID валюты ЦБ РФ, его можно взять в справочнике (см. выше).


В ячейке A6 мы подготовим URL:

="https://www.cbr.ru/scripts/XML_dynamic.asp?"
& "date_req1=" & TEXT(TODAY() - 7; "dd/mm/yyyy")
& "&date_req2=" & TEXT(TODAY(); "dd/mm/yyyy")
& "&VAL_NM_RQ=R01235"

Следующая формула выведет дату курса и его значение в двух колонках:

={
  "Дата"\ "Курс";
  IMPORTXML(A6; "//Record/@Date")\
  ARRAYFORMULA(
      IMPORTXML(A6; "//Value") / IMPORTXML(A6; "//Nominal")
  )
}


Курс доллара США в Российских рублях за последние 7 дней


НБУ - Курсы валют на заданную дату


Аналогично ЦБ РФ, не будем разбираться с HTML, так как НБУ предоставляет (описание) различные данные в формате XML или JSON.


Нас интересует первый раздел с курсами валют.


По следующей ссылке можно получить курс выбранной валюты (ISO Code) на указанную дату (25.05.2021):

https://bank.gov.ua/NBUStatService/v1/statdirectory/exchange?valcode=EUR&date=20210521


Если убрать из запроса параметр valcode, то получим курсы всех известных НБУ валют на 25.05.2021:

https://bank.gov.ua/NBUStatService/v1/statdirectory/exchange?date=20210521


В ячейке A6 мы подготовим URL:

="https://bank.gov.ua/NBUStatService/v1/statdirectory/exchange?date=" & TEXT(DATE(2021; 5; 25); "yyyymmdd")

Следующая формула выведет нам две колонки: код валюты и курс.

={
  "CharCode"\ "Курс";
  IMPORTXML(A6; "//cc")\
  ARRAYFORMULA(
    --SUBSTITUTE(IMPORTXML(A6; "//rate"); "."; ",")
  )
}


Курсы валют НБУ на 25.05.2021


Не забываем менять точку на запятую (SUBSTITUTE(...; "."; ",")) и преобразовывать в число (--(...)).


Если убрать из ссылки параметр date, получим текущие курсы валют.


НБУ - Значения курса валюты за период


Я не увидел в документации НБУ ссылки, по которой можно получить данные о динамике курса выбранной валюты за указанный период. Поделитесь в чате, если знаете.


НБ РБ - Справочник по валютам


Всё очень похоже на ЦБ РФ.


Описание XML тут (сильно лучше ЦБшного):

https://www.nbrb.by/statistics/rates/xml


Тут у ЦБ РФ справочник по валютам:

https://www.cbr.ru/scripts/XML_valFull.asp


С помощью следующей (в A6 ссылка на данные справочника) формулы достаём все поля этого справочника. Первой колонкой атрибут Id элементов <Currency> (одна из валют) - xpath //Currency/@Id, последующие колонки - все подэлементы каждого <Currency> - xpath //Currency.

={
  "Id"\ "NumCode"\ "CharCode"\ "Scale"\ "Name"\ "EnglishName"\ "ParentCode";
  IMPORTXML(A6; "//Currency/@Id")\
  IMPORTXML(A6; "//Currency")
}


Достаём справочник по валютам: названия и коды


НБ РБ - Курсы валют на заданную дату


По этой ссылке можно получить курсы валют на заданную дату (для другой даты достаточно соответственно поменять конце строки):

https://www.nbrb.by/services/xmlexrates.aspx?ondate=05/25/2021


Обратите внимание на элемент <Scale>. Чаще всего это 1 (например, 2.5092 Белорусских рубля за 1 доллар США), но бывает больше (например, 2.3043 Белорусских рубля за 100 Японских йен). Для получения курса за 1 единицу валюты, значение элемента <Rate> надо разделить на значение элемента <Scale>.


Отсюда формула. Первая колонка - элемент <CharCode> (полученный курс надо будет где-то использовать, найти его сможем, например, по CharCode), вторая - курс.


В ячейке A6 мы подготовим URL:

="https://www.nbrb.by/services/xmlexrates.aspx?ondate=" & TEXT(DATE(2021; 5; 25); "mm/dd/yyyy")

Итоговая формула:

={
  "CharCode"\ "Курс";
  IMPORTXML(A6; "//CharCode")\
  ARRAYFORMULA(
      --SUBSTITUTE(IMPORTXML(A6; "//Rate"); "."; ",") / IMPORTXML(A6;  "//Scale")
  )
}


Курсы валют в Белорусских рублях на 25.05.2021


НБ РБ - Значения курса валюты за период


По этой ссылке можно получить курс доллара США за предыдущие 7 дней:

https://www.nbrb.by/services/xmlexratesdyn.aspx?curid=145&fromdate=5/18/2021&todate=5/24/2021


Параметр в ссылке curid - это внутренний ID валюты НБ РБ, его можно взять в справочнике (см. выше, первый столбец).


В ячейке A6 мы подготовим URL:

="https://www.nbrb.by/services/xmlexratesdyn.aspx?"
& "curid=145"
& "&fromdate=" & TEXT(TODAY() - 7; "mm/dd/yyyy")
& "&todate=" & TEXT(TODAY(); "mm/dd/yyyy")

Следующая формула выведет дату курса и его значение в двух колонках:

={
  "Дата"\ "Курс";
  IMPORTXML(A6; "//Record/@Date")\
  ARRAYFORMULA(
      --SUBSTITUTE(IMPORTXML(A6; "//Rate"); "."; ",")
  )
}


Курс доллара США в Белорусских рублях за последние 7 дней

НБ РК

Аналогично можно получить курсы с сайта НБ РК. Описание тут.

Соответствующий пример добавили в таблицу.


XE.com - Курсы валют на заданную дату


XE.com - один из популярных ресурсов, где тоже можно посмотреть курсы валют (и исторические данные доступны без javascript, так что мы их сможем легко импортировать в таблицу). У них есть платное API, но можно импортировать HTML страницу с данными.


Например, курс доллара США в других валютах на 25.05.2021:

https://www.xe.com/currencytables/?from=USD&date=2021-05-25



Во второй половине страницы таблица с данными, которая нас интересует:


В ячейке A6 мы подготовим URL:

="https://www.xe.com/currencytables/?from=USD&date=" & TEXT(DATE(2021; 5; 25); "yyyy-mm-dd")

Достанем первую таблицу с данными с помощью функции IMPORTHTML() (документация):

=IMPORTHTML(A6; "table"; 1)


Курс доллара США в различных валютах (и обратно) с XE.com


На XE.com можно узнать, например, сайт центрального банка для какой-нибудь валюты (может, у них тоже есть ссылки с XML?):

https://www.xe.com/currency/inr-indian-rupee/


MOEX – Текущий курс с Московской Биржи

Добавили в таблицу пример конкретно для текущих курсов 3-х валют: CNY, EUR, USD по отношению к RUB.


Аналогично предыдущим примерам достаём данные из xml (но можно и html или json использовать).


Нам понадобится ссылка:

https://iss.moex.com/iss/engines/currency/markets/selt/boards/CETS/securities.xml?iss.only=marketdata&marketdata.columns=SECID,LAST&securities=USD000000TOD,EUR_RUB__TOM,CNY000000TOD

Откуда такие ссылки брать немного описано у нас в короткой статье про то, как доставать данные с мосбиржи.


Данных может не быть, если биржа работает, но за сегодня ещё не было сделок. Данные предоставляются с задержкой в 15 минут (для этих бесплатных запросов).


Тут мы запросили только 3 валюты. Если убрать этот фильтр (securities=..., тут через запятую перечисленные коды инструментов, получим всё, что есть.



Тут можно посмотреть значение на самой бирже, чтобы проверить.



Существует множество других источников данных о курсах валют. Для них можно самостоятельно попробовать адаптировать то, что написано выше.


Cсылки


Таблица с описанными примерами (делайте копию)


Функции Google Sheets


XPath

В интернете полно информации об использовании XPath. Больше экспериментируйте, чтобы разобраться.


Источники данных по курсам валют


Правильный канал о Таблицах (Google Sheets): @google_sheets

Чат канала: @google_spreadsheets_chat

Report Page