Google Docs: текущий курс валюты

Текущий курс валюты (в примере — курс доллара ЦБ РФ) можно получить с помощью следующей функции:

=IMPORTXML("http://www.cbr.ru/scripts/XML_daily.asp"; "//ValCurs/Valute[CharCode=""USD""]/Value")

То же самое на любую дату:

=IMPORTXML("http://www.cbr.ru/scripts/XML_daily.asp?date_req=01/01/2011"; "//ValCurs/Valute[CharCode=""USD""]/Value")

Дополнение от 7 янв. 2015:
Спасибо Илье Кочеткову за упрощение формулы. Старый вариант под катом. Возможно, кому-то пригодятся и решения из него. А можно даже ещё проще, т.к. буквенный код валюты уникален:
=IMPORTXML("http://www.cbr.ru/scripts/XML_daily.asp"; "//*[*=""USD""]/Value")
Спасибо Михаилу.

Дополнение от 13 фев. 2016:
Есть способ проще, с использованием встроенной функции:

=GOOGLEFINANCE("USDRUB")

Однако это не курс ЦБ РФ. Указывать дату также можно; подробная справка по функции находится здесь. Спасибо за подсказку Ивану.

Старый вариант:

=IMPORTXML("http://www.cbr.ru/scripts/XML_daily.asp"; "//ValCurs/Valute[@id="&char(34)&"R01235"&char(34)&"]/Value")

То же самое на любую дату:

=IMPORTXML("http://www.cbr.ru/scripts/XML_daily.asp?date_req=01/01/2011"; "//ValCurs/Valute[@id="&char(34)&"R01235"&char(34)&"]/Value")
  • Denis Safrashenkov

    Спасибо огромное, отличный пример

  • Спасибо!
    загуглил запрос_xpath (второй параметр)
    вида
    «//ValCurs/Valute[CharCode=»»USD»»]/Value»
    будет понятней

    • Спасибо, обновил статью.

  • Ник

    сегодня захотел работать только поиском по нумкоду:
    =IMPORTXML(«http://www.cbr.ru/scripts/XML_daily.asp»; «//ValCurs/Valute[NumCode=»»840″»]/Value»)

  • Илия Кулик

    Как сделать тоже самое, но с гривной?

    • Подставить вместо USD трёхбуквенное наименование гривны: UAH.

  • прохожий

    Перестал работать как то (

    • Периодически бывает, что сайт ЦБ РФ не отдаёт XML. Таких случаев за день может быть несколько штук, но обычно это непродолжительно.

  • ruslan rus

    Можно через скрипт, во примерно так, криво конечно, но для меня пойдет, по крайней мере дату не вручную вводить можно.

    Пишем скрипт, дополнение — редактор скриптов:
    function ff(input) {
    var x = new Date(input);
    var to= ( String(x.getDate()).replace(/^(.)$/, «0$1»)+’/’+ String(x.getMonth()+1).replace(/^(.)$/, «0$1») + ‘/’ + x.getFullYear());
    // Преобразует дату из ячейки к виду dd/mm/yyyy формате тест
    var fist= ‘http://www.cbr.ru/scripts/XML_daily.asp?date_req=’;
    var u1 = fist + to // первый аргумент
    return u1;
    }

    Не забываем тригер на открытие таблицы настроит.

    В таблицы выбираем ячейку вводим:

    =ff(«ссылка на ячейку с датой»)

    Данная функция будет возвращать ссылку, типа: http://www.cbr.ru/scripts/XML_daily.asp?date_req=01/01/2011

    с датой указной в ячейке.
    Способ конечно кривой. Может кто засунет все в скрипт. Может я потом сделаю.
    Спасибо за формулу.

    Для будущих дат, можно использовать логическую функцию, типо вот такую

    =if(TODAY()<B4; IMPORTXML(ff(TODAY());"//ValCurs/Valute[CharCode=""USD""]/Value");IMPORTXML(ff(B4);"//ValCurs/Valute[CharCode=""USD""]/Value"))
    Вроде правильно)

    • Я не совсем понял про ввод даты вручную. В формуле точно так же можно брать дату из ячейки.

      • ruslan rus

        необходим чтобы это ячейка содержала тип данных текст, а обычно используется тип данных дата. я про это.

        • есть функция TO_TEXT плюс форматирование даты

      • Александр Николаевич

        Подскажи, пожалуйста, как взять дату из ячейки?

        • Просто сослаться на ячейку, и всё. А объединить со строкой с помощью CONCATENATE. Вот пример:

          <pre>
          =IMPORTXML(CONCATENATE("http://www.cbr.ru/scripts/XML_daily.asp?date_req="; D1);"//ValCurs/Valute[CharCode=""USD""]/Value")
          </pre>

          В этом примере D1 — адрес ячейки с датой.

  • Иван УМастеров

    Можно проще:
    =GOOGLEFINANCE(«USDRUB»)

  • Foxtrot

    Спасибо, сильно упрощает жизнь!
    Еще бы аналогичным образом проставить кросс-курс €/$, может есть наводки?

    • Если не устраивает функция GOOGLEFINANCE, и нужен именно курс ЦБ РФ, то можно кросс-курс посчитать через рубль.

  • Михаил

    Упрощаем, упрощенную формулу :) =IMPORTXML(«http://www.cbr.ru/scripts/XML_daily.asp»; «//*[CharCode=»»USD»»]/Value»)

  • Михаил

    Так как название каждой валюты всего 1 раз встречается в документе, то еще можно xpath запрос упросить до «//*[*=»»USD»»]/Value»

    • Да, действительно :) Спасибо.

  • Михаил

    Во мне умер оптимизатор :) Для четких пацанчиков привязка по ID: «//*[@ID=’R01235′]/Value»

    • Ну по названию валюты всё-таки проще для понимания.

  • Pac1f1c

    Подскажите как с «http://www.cbr.ru/scripts/xml_metall.asp?date_req1=число/меся/год&date_req2=число/меся/год» парсить в гугл докс цену драг металла?

    • По аналогии :) Или уточните, пожалуйста, что именно Вам нужно и за какие периоды.
      Вот пример формулы для вывода цен покупки для нескольких дат и металла с кодом «1»:

      =IMPORTXML("http://www.cbr.ru/scripts/xml_metall.asp?date_req1=10/06/2016&date_req2=20/06/2016";"//Record[@Code='1']/Buy")
      • Pac1f1c

        Отлично! Вообще я мимопроходящий и кодить не умею.) Просто удовлетворяю свой хозяйственный интерес). На самом деле в идеале хочется получить такой же результат как и для курса валют, т.е. именно единичное значение текущего курса. Но на сайте цб рф нет функции вывода текущего значения, только вывод за период. Может есть какой-нибудь деликатный вариант ?)

        • Очевидное решение — подставить одну и ту же дату в параметры адресной строки «date_req1» и «date_req2»:
          http://www.cbr.ru/scripts/xml_metall.asp?date_req1=21/06/2016&date_req2=21/06/2016
          Соответственно, применительно к приведённому выше примеру:

          =IMPORTXML("http://www.cbr.ru/scripts/xml_metall.asp?date_req1=10/06/2016&date_req2=20/06/2016";"//Record[@Code='1']/Buy")

          Просто подставляете нужный id валюты и необходимый тип цену – Buy или Sell.
          Если нужно на сегодняшний день, то подставляете вместо даты формулу, преобразующую сегодняшний день в нужный формат:

          =TEXT(TODAY();"dd/mm/yyy")

          Ну и в итоговой формуле это выглядит так:

          =IMPORTXML("http://www.cbr.ru/scripts/xml_metall.asp?date_req1=" & TEXT(TODAY();"dd/mm/yyy") & "&date_req2=" & TEXT(TODAY();"dd/mm/yyy");"//Record[@Code='1']/Buy")

          И это не «кодинг» :)

          • Pac1f1c

            Да прибудет с вами сила! Спасибо!)

          • snkreg snkreg

            KodopiK, здравствуйте. Благодарю Вас за Ваш труд и ресурс. В частности, за разбор данного «лайфхака» в Гуглотаблицах.
            У меня вопрос — Ваша итоговая формула, с подставлением даты (=TEXT(TODAY();»dd/mm/yyy»)) — не работает. Как я не пытался реанимировать — никак.
            В тоже время статическое указание диапазона даты — работает без изменений.
            (=IMPORTXML(«http://www.cbr.ru/scripts/xml_metall.asp?date_req1=10/06/2016&date_req2=20/06/2016″;»//Record[@Code=’1′]/Buy»)_
            Подскажите, пожалуйста — как мне быть? Задача ровно та же самая — иметь в таблице цену золота на сегодняшний день.
            Благодарю Вас.

          • Здравствуйте. Спасибо за отзыв.

            Просто сайтом ЦБ РФ сейчас почему-то не выдаются данные по ссылкам:
            http://www.cbr.ru/scripts/xml_metall.asp?date_req1=31/07/2017&date_req2=31/07/2017
            http://www.cbr.ru/scripts/xml_metall.asp?date_req1=30/07/2017&date_req2=30/07/2017

            А вот на 29-е число есть данные:
            http://www.cbr.ru/scripts/xml_metall.asp?date_req1=29/07/2017&date_req2=29/07/2017

            Хоть это и ЦБ РФ, у них тоже случаются технические ошибки. Напишите им в поддержку о замеченной неисправности. Они обычно чинят.

            Удачи!

  • Oleg Briukhanovski

    Приведенная формула выдает целое число, нет запятой после рублей. Соответственно, чтобы использовать в расчетах, приходится импортированное значение делить на 10 000. Возможно есть какое-то более элегантное решение?

    • У меня выдаётся число в формате: «63,0399». Возможно, Вам нужно поправить настройки таблицы. А именно региональные настройки — чтобы запятая, а не точка, была дробным разделителем. Поставьте российский (европейский), а не американский формат чисел. Делается это здесь: Файл → Настройки таблицы → Региональные настройки.

      • Oleg Briukhanovski

        Спасибо, но не помогло. После смены формата у меня выдается число «624 499,00».

        • Очень странно. Перед тем, как Вам ответить, специально протестировал на чистом файле. Моя теория подтвердилась. Видимо, есть ещё какой-то фактор, влияющий на вывод.

          Но ведь деление — тоже вполне себе элегантное решение :)

          • Oleg Briukhanovski

            Спасибо)

  • Marián Chorney

    Здравствуйте,
    помогите пожалуйста решить слудующую задачу: пытаюсь создать формулу в гугл докс (таблица ексель) чтобы автоматически импортировало в ячейку актуальные курсы некоторых криптовалют, например Биткойн/евро и Рыппл/евро с сайта https://www.bitstamp.net/. Как написать формулу чтобы ето работало. Заренее всем благодарен за ответ. С уважением Марьян.

    • Добрый день.
      Вообще-то работает просто

      =GOOGLEFINANCE("BTCEUR")

      Но если надо именно с Bitstamp, то лучше брать курс из тех источников, которые отдают данные в нормальном виде. Например, для этого подойдёт Bitstamp API:
      https://www.bitstamp.net/api/v2/ticker/btceur/
      Проблема в том, что данные выдаются в JSON, а в Google Spreadsheets нет встроенной функции для обработки этого формата. Можно написать свою, но это работа со скриптами. Оно Вам надо?

      • Marián Chorney

        Здравствуйте,
        спасибо за быстрый ответ. Через =GOOGLEFINANCE(«BTCEUR») это я сделал но там нету другой крипты. Идеально было бы взять курсы с https://coinmarketcap.com/#EUR. Там есть практически вся крипта. Но для этого мне уже знаний не зватает.

        • Вот прям такой в точности тикер — BTCEUR — точно есть. У меня это работает. В точности Ваш пример — биткойн и евро.

      • Moisey

        Зачем скрипт? Всё в одну строчку умещается, если с importdata заюзать index, sustitute, regexextract и value. Но проблема в том, что всё эти IMPORTXML,IMPORTDATA, GOOGLEFINANCE это не текущие (не real-time) котировки, временной лаг до 20 минут! Я вообще сомневаюсь, что в гугл докс возможно организовать обновление котировок хотя бы раз в секунду. Т.е. все эти функции можно применять только для долгосрочного планирования, но не для определения текущих котировок в данный момент.

        • Google Таблицы для этого и не предназначены.