понедельник, 12 марта 2012 г.

Вставка текущего курса валют USD/UAH в ячейку таблицы google docs

Google Docs Spreadsheets очень удобный онлайн инструмент для ведения бухгалтерии. Допустим, что такая бухгалтерия ведеться в долларах США, но в конечном итоге надо получить все суммы в гривнах, учитывая текущий курс валют.

Как выход - в ячейку вбить текущий курс и отталкиватся от него. Минус такого подхода состоит в том, что постоянно придется корректировать этот самый текущий курс (как минимум раз в день) .

Есть удобные онлайн сервисы, которые постоянно показывают курсы валют. Почему бы и нам их не использовать в своей таблице?

На самом деле, тут все решабельно. В качестве такого онлайн сервиса, будет использовать ся Yahoo Finance. Страница, которая предоставляет нужный тип информации (USD в UAH) будет такая: http://finance.yahoo.com/q?s=USDUAH=X.

Остается только выбрать нужное значение со страницы и использовать для себя:

=VALUE(SUBSTITUTE((SUBSTITUTE(INDEX(ImportHTML("http://finance.yahoo.com/q?s=USDUAH=X";"table";1); 1;2);"*";""));".";","))


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

Теперь немного детальнее пройдемся  по формуле:

VALUE - конвертирует текст в чисельное значение

SUBSTITUTE - функция, кторая заменяет одно значение в строке на другое. В нашем примере, мы сначала заменяем * на пустое значение (так как резуьтат выгребается в виде *7.92*), после чего, заменим точку на запятую - так как разделитель дробной части у меня запятая.

INDEX - получаем элемент массива (ячейку таблицы со значением курса валют)

ImportHTML - по заданому URL выгребаем контент, ищем в нем 1 таблицу.

46 комментариев:

  1. Странное дело - почему то не работает формула..

    ОтветитьУдалить
    Ответы
    1. Просто сейчас в yahoo, в ячейке не одно число курса, а диапазон: 8,027 - 8,3. Они немного поменяли там верстку и логику отображения

      Потому немножко усовершенствуем формулу: добавим регулярку, которая возьмет левую границу диапазона:
      =value(RegExExtract(SUBSTITUTE((SUBSTITUTE(Index(ImportHTML("http://finance.yahoo.com/q?s=USDUAH=X";"table";3); 1;2);"*";""));".";",");"[0-9,]+"))

      Регулярка в гуглдоке работает так: RegExExtract(текст; регулярное_выражение)

      Если хотите среднее значение то надо либо пошаманить с формулами либо поискать другой ресурс с курсом валют - где есть не диапазон, а точное значение курса ;)

      Удалить
  2. не пойму, как вставить значение отсюда http://www.google.com/finance?q=usdrub
    Можно попросить объяснить - не могу сам дойти:)

    ОтветитьУдалить
    Ответы
    1. Если вы хотите достать курс рубля который там сверху указан большим шрифтом, то вам нужно:
      1) с помощью функции ImportXML и условия XPASS найти нужный контейнер на странице (предварительно анализируем с помощью firebug структуру HTML)
      2) так как в роли разделителя десятичной части там используется точка вместо запятой то, соответственно, нужно заменить точку на запятую функцией SUBSTITUTE
      3) теперь из строки вида "29,5792 RUB" ругулярным выражением достаем число
      4) функция value(str) приводит текст к числовому значению с плавающей точкой
      5) можно использовать ячейкув ваших формулах

      Результирующая формула: =value(RegExExtract(SUBSTITUTE(ImportXML("http://www.google.com/finance?q=usdrub";"//div[@class='sfe-break-bottom-4']/span[@class='pr']/span");".";",");"[0-9,]+"))

      Удалить
    2. Вот круто:) Спасибо!

      Удалить
    3. Сергей, подскажите пожалуйста, как выглядит формула, если мне нужна например котировка Apple Inc.(NASDAQ:AAPL)
      Понимаю, что вместо usdrub нужно вписать AAPL, но после этого формула перестает работать.
      Сам не программист, поэтому не разберусь.

      Заранее благодарен.

      Удалить
  3. А можете помочь с Яндекса курс вытащить (там он ЦБ РФ) http://news.yandex.ru/quotes/1.html!!! Сама не могу - не понимаю в коде ничего(((

    ОтветитьУдалить
    Ответы
    1. Курс Google finance:
      $ =round(GoogleFinance("CURRENCY:USDRUB" ; "average");2)
      € =round(GoogleFinance("CURRENCY:EURRUB" ; "average");2)

      Курс Центробанк
      $ =round(importXML(CONCATENATE("http://www.cbr.ru/scripts/XML_daily.asp?date_req=";today());"/ValCurs/Valute[@id='R01235']/Value");2)
      € =round(importXML(CONCATENATE("http://www.cbr.ru/scripts/XML_daily.asp?date_req=";today());"/ValCurs/Valute[@id='R01239']/Value");2)

      Коды валют центробанка http://www.cbr.ru/scripts/Root.asp?Prtid=SXML

      (с) http://productforums.google.com/forum/#!topic/docs-ru/SESkZRDXWlM

      Удалить
  4. Подскажите пожалуйста, нужно вытащить символ с yahoo в GDocs со знаком ^, как это сделать?

    ОтветитьУдалить
  5. Подскажите пожалуйста, как вытащить отсюда - http://www.google.com/finance?q=NASDAQ%3AAAPL&ei=A2CuUMDGJ-ONwAPqLg
    данные, которые выделены черным жирным шрифтом?
    Пробовал на примере с символом usdrub, ничего не выходит.
    Сам не программист, разобраться не могу.
    Заранее благодарен.

    ОтветитьУдалить
    Ответы
    1. Евгений, я так понял имелось ввиду число выделеное самым большим и жирным шрифтом 561.70? Если да, то решение ниже:

      =VALUE(SUBSTITUTE(ImportXML("http://www.google.com/finance?q=NASDAQ%3AAAPL&ei=A2CuUMDGJ-ONwAPqLg";"//div[@id='price-panel']/div[1]/span/span");".";","))

      Удалить
    2. Да, именно это число. Сенкс за формулу! Но есть одно "НО" Сергей.
      Если вам не сложно, выделите пожалуйста жирным шрифтом, что нужно менять в этой формуле, что бы работали еще и трехзначные котировки, или двухзначные, или восьмизначные и т.д.
      Например такая котировка имеет пять знаков и она работает: 561.70
      А если котировка имеет три знака, то уже не работает: 9.06
      http://www.google.com/finance?q=NASDAQ%3ADELL&ei=61KvUMA-yvfAA5iWAQ

      Покажите плз, что нужно поменять?

      Удалить
    3. p.s. Вопрос снят, разобрался.

      Но есть другой вопрос: как выглядит формула для такого индекса - http://www.google.com/finance?q=INDEXSP%3A.INX&ei=MSiyUKDrOsWrwAO3cw
      Удаление запятой функцией SUBSTITUTE не помогает, т.к. удаляются все запятые.

      Заранее благодарен.

      Удалить
    4. Формат числа примерно такой: 1,406.90 - запятая просто разбивает число на части кратные 3 нулям, а дробная часть традиционно после точки.
      Поэтому сначала просто удалим запятые, а потом точку заменим на запятую:
      =VALUE(SUBSTITUTE(SUBSTITUTE(ImportXML("http://www.google.com/finance?q=INDEXSP%3A.INX&ei=MSiyUKDrOsWrwAO3cw";"//div[@id='price-panel']/div[1]/span/span");",";"");".";","))

      Можно написать и регулярное выражение, но так проще для понимания не-программистам

      Удалить
    5. Если с предыдущим вопросом разобралось, то выложите свое решение: кому-то пригодится, я не всегда могу сразу отвечать на вопрос, так как мало свободного времени - потому часто могу отписать только через день-два

      Удалить
    6. Сергей спасибо за ответы.
      Понял в чем ошибка. Я делал наоборот, сперва менял запятую на точку, а потом убирал запятые )))
      Предыдущий вопрос снят по той причине, что котировки поши. Видать я неверно копировал данные из адресной строки.

      Еще раз спасибо за помощь.

      Удалить
    7. Случайно не в курсе, как вытянуть код всего портфолио для вставки графика на сайт.
      Например вот этого - http://www.google.com/finance/portfolio?action=view&pid=3&ei=bIu0UIDrBqmYwQOoiAE
      Полистал ваш блог, ответ не нашел.

      Удалить
    8. у меня в гугл аккаунте нет портфолио :) потому посмотреть немогу. Если на странице есть данные то их все можно вытянуть в отдельные ячейки вашей таблицы как в примерах выше, а уже по ним построить график. Но нельзя злоупотреблять формулами, так как придеться для каждой ячейки фактически слать запрос на сервер.
      ImportXML("http://...) это уже запрос, на каждый запрос + парсинг + выполнение формулы будут задержки, потому желательно запросить всю страницу за один раз. Например весь нужный кусок страницы запихнуть в скрытую ячейку и парсить уже всем из нее данные.

      Но, для сложных задач правильнее всего использовать скрипты, которые поддурживают гугл таблицы, стартовая дока https://developers.google.com/apps-script/your_first_script

      Оно похоже на VisualBasic for Microsoft Office, принцип тот же, только язык другой в основе: JavaScript

      Но придется читать доки и учится писать на нем под таблицы :)
      Документация есть

      Удалить
  6. А не подскажете, с этого сайта http://www.bsb.by/ вообще можно курсы спарсить в гугл док? А то мне именно обменные курсы надо, но что-то самому не получилось.
    Буду очень благодарен за помощь или совет.
    Спасибо!
    Никита

    ОтветитьУдалить
    Ответы
    1. Конечно можно, если верстка сайта не меняется. Нужно найти контейнер id=block-currency и внутри него найти и распарсить таблицу с курсами

      Удалить
  7. Сергей, не поможете мне создать формулу, чтоб в гугл док показывался ежедневный курс продажи фунта и доллара по приватбанку с этого сайта http://kurs.com.ua/privatbank. До двух ночи промучалась- ничего не вышло(((

    ОтветитьУдалить
  8. Не получилось найти решение следующей задачи.
    Из web страницы с помощью importXML вставляем нужное значение, например, тот же курс валют, в ячейку. Это значение (курс) на исходном сайте постоянно изменяется. Как организовать соответствующее по заданному периоду обновление этого значения в ячейке таблицы Google?

    ОтветитьУдалить
    Ответы
    1. Если изменяется сам курс то все правильно, формула каждый раз при открытии таблицы будет запрашивать текущий курс (или обновить страницу). В этом и есть смысл использовать динамическую формулу в гуглдок, иначе проще скопировать курс с нужного сайта в ячейку

      Удалить
    2. Это понятно. Интересует, обновление курса не при открытии таблицы, а по расписанию, через заданные промежутки времени.

      Удалить
  9. только вот с формулой никак не получается((...

    ОтветитьУдалить
  10. Приветсвую! Можете кратко пояснить IMPORTHTML(url, query, index) что означают query и индекс. Как их определить/выбрать? В гугл справке написано совсем непонятно.

    ОтветитьУдалить
    Ответы
    1. https://support.google.com/drive/answer/3093339?hl=en

      Удалить
    2. пример http://www.labnol.org/internet/import-html-in-google-docs/28125

      Удалить
    3. query = table или list
      ищем по указаному пути на странице таблицу либо список
      index - какая по счету таблица или список в документе будет взята
      таблица находится по тегам table, список по тегам ul, ol

      Удалить
  11. Добрый день!

    Скажите пожалуйста, как можно сделать курс валю через этот сайт:
    http://finance.i.ua/

    Необходимо из левой нижней колонки взять курс доллара с Банка ПриватБанк.
    Так же взять курс НБУ.

    спасибо за ответ

    ОтветитьУдалить
    Ответы
    1. Добрый день, вечером посмотрю и опубликую решение

      Удалить
  12. Точно такая же просьба.
    Спасибо за понимание)

    ОтветитьУдалить
  13. Здравствуйте!

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

    Вот скриншот источника, откуда нужно брать курсы. Весьма благодарен!

    ОтветитьУдалить
    Ответы
    1. Здравствуйте! Невижу скриншота в аттачментах. Выложите его на каком-то паблик ресурсе и приатачте ссылку. В свободное время посмотрю

      Удалить
  14. Подскажите, пожалуйста, можно ли вытащить данные если на странице по ссылке-скрипту открывается всплывающее окно, в котором и находится таблица.
    Страница: https://www.skrill.com/ru/dljachastnykhlic/tarify/
    Ссылка-скрипт на словах ( javascript:;" id="shfx">оптового курса обмена валют<)

    Конкретно нужно значение EUR/USD из этой таблицы.
    Спасибо

    ОтветитьУдалить
    Ответы
    1. Все данные лежат там в JSON файле https://www.skrill.com/fileadmin/templates/main/res/js/json/fxrates.js
      Распарсить элементарно, ключ - Валюта, а значение - Курс валюты

      Удалить
    2. спасибо, за ответ, но я не совсем понимаю, как в гуглдокс распарсить по : ключ - Валюта, а значение - Курс валюты.
      Буду благодарен за пояснения.

      Удалить
    3. Нужно скрипт спец. подключить, инструкция тут https://docs.google.com/spreadsheets/d/1NSdHqIueq6Ie1zU0atK4hHvqqqoxu7lW7eTMTRx6--4/edit#gid=0

      Удалить
  15. Добрый день, Сергей! Помогите пожалуйста с формулой для вставки значения в google docs курса валют с сайта bin.ua. Интересует Межбанковский рынок курс валют евро и доллар. Спасибо!

    ОтветитьУдалить
  16. Скажите, пожалуйста. А если нужен курс рубля на определенную дату, то как будет выглядит формула. Спасибо.

    ОтветитьУдалить
  17. Добрый день, Сергей!
    Помогите пожалуйста с формулой для вставки значения в google таблицу курса валют евро и рубля.
    Спасибо!

    ОтветитьУдалить
  18. можно ли сделать значение поиска переменным, чтобы таблица курсов разных стран подтягивалась?
    Я пытался использовать функцию =сцепить("http://www.google.com/finance?q=usd;С2;";"//div[@class='sfe-break-bottom-4']/span[@class='pr']/span")
    где С2 mxd
    в С3 rub и так далее, но почему-то гугл выдает ошибку.
    пробовал и на стороне сцеплять все и потом подсовывать ячейку со строкой, но всё равно не принимает.
    Есть ли у кого-то идеи как сделать правильно?

    ОтветитьУдалить