Api мосбиржи в microsoft excel xlsx

Файлы к уроку:

  • Для спонсоров Boosty
  • Для спонсоров VK

Ссылки:

  • Страница курса
  • Плейлист YouTube
  • Плейлист ВК

Описание

В этом уроке мы научимся получать прямо в Excel котировки разных ценных бумаг с сайта Московской биржи.

Решение

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

Если мы введем такую ссылку в Power Query, создав запрос из интернета, то получим интересующие нас котировки прямо в Excel.

Вот ссылка на сайте Московской биржи https://iss.moex.com/iss/reference/ На этой странице вы можете увидеть какую именно информацию вы можете получить с сайта Московской биржи. Котировками дело не ограничивается.

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

Наша ссылка будет выглядеть так — https://iss.moex.com/iss/history/engines/stock/markets/shares/securities/SBER/securities.xml

В том месте, где написано SBER нужно вставить тикер интересующей вас ценной бумаги. Далее, развернув таблицу, вы получите таблицу с котировками, но только 100 строк. Это максимальное количество, которое позволено выгружать. Нам нужно что-то придумать, чтобы выгружать больше строк.

Что делать, чтобы получить много строк? Нужно использовать параметр start. Мы создадим столбец с числами с инкрементом 100 и в каждой строке будем запрашивать информация по ссылке.

Примененные функции

  • Xml.Tables
  • Web.Contents
  • List.Numbers
  • Table.FromList
  • Splitter.SplitByNothing
  • ExtraValues.Error
  • Table.AddColumn
  • Text.From
  • Table.SelectColumns
  • Table.ExpandTableColumn
  • Table.TransformColumnNames
  • Text.AfterDelimiter

Код

Пример получения 100 строк:

let
   source = Xml.Tables(
      Web.Contents(
         "http://iss.moex.com/iss/history/engines/stock/markets/shares/securities/SBER/securities.xml?start=300"
      )
   ){0}[Table]{0}[rows]{0}[row]
in
   source

Пример получения 4000 строк:

let
   source = List.Numbers(1, 40, 100),
   to_table = Table.FromList(
      source,
      Splitter.SplitByNothing(),
      null,
      null,
      ExtraValues.Error
   ),
   table_add_col = Table.AddColumn(
      to_table,
      "Пользовательская",
      each Xml.Tables(
         Web.Contents(
            "http://iss.moex.com/iss/history/engines/stock/markets/shares/securities/SBER/securities.xml?start="
               & Text.From([Column1])
         )
      ){0}[Table]{0}[rows]{0}[row]
   ),
   cols_select = Table.SelectColumns(table_add_col, {"Пользовательская"}),
   col_expand_table = Table.ExpandTableColumn(
      cols_select,
      "Пользовательская",
      {
         "Attribute:BOARDID",
         "Attribute:TRADEDATE",
         "Attribute:SHORTNAME",
         "Attribute:SECID",
         "Attribute:NUMTRADES",
         "Attribute:VALUE",
         "Attribute:OPEN",
         "Attribute:LOW",
         "Attribute:HIGH",
         "Attribute:LEGALCLOSEPRICE",
         "Attribute:WAPRICE",
         "Attribute:CLOSE",
         "Attribute:VOLUME",
         "Attribute:MARKETPRICE2",
         "Attribute:MARKETPRICE3",
         "Attribute:ADMITTEDQUOTE",
         "Attribute:MP2VALTRD",
         "Attribute:MARKETPRICE3TRADESVALUE",
         "Attribute:ADMITTEDVALUE",
         "Attribute:WAVAL"
      },
      {
         "Attribute:BOARDID",
         "Attribute:TRADEDATE",
         "Attribute:SHORTNAME",
         "Attribute:SECID",
         "Attribute:NUMTRADES",
         "Attribute:VALUE",
         "Attribute:OPEN",
         "Attribute:LOW",
         "Attribute:HIGH",
         "Attribute:LEGALCLOSEPRICE",
         "Attribute:WAPRICE",
         "Attribute:CLOSE",
         "Attribute:VOLUME",
         "Attribute:MARKETPRICE2",
         "Attribute:MARKETPRICE3",
         "Attribute:ADMITTEDQUOTE",
         "Attribute:MP2VALTRD",
         "Attribute:MARKETPRICE3TRADESVALUE",
         "Attribute:ADMITTEDVALUE",
         "Attribute:WAVAL"
      }
   ),
   types = Table.TransformColumnNames(
      col_expand_table,
      each Text.AfterDelimiter(_, ":")
   )
in
   types

Этот урок входит в курс Веб-запросы в Power Query

Номер урока Урок Описание
1 Котировки Yahoo Finance Вы хотите получить историю котировок акций MCD с 2000 года по текущий день с сайта Yahoo Finance. Вы копируете ссылку на раздел с историческими данными, вставляете ссылку в Power Query и получаете только 100 строк.
2 HTML, получение данных по облигациям Мы хотим получить данные по всем облигациям со страницы bonds.finam.ru
3 Многостраничное извлечение На разных страницах находятся сайта находятся котировки золота на каждый год. Нужно соединить все данные в одну таблицу.
4 JSON, Котировки Yahoo Finance 2 В этом уроке мы разберем еще один способ скачивания котировок с Yahoo Finance. Этот способ намного удобнее и быстрее. Здесь мы научимся обрабатывать формат JSON.
5 Котировки Московской биржи В этом уроке мы научимся получать прямо в Excel котировки разных ценных бумаг с сайта Московской биржи.
Московская биржа предоставляет возможность скачивать котировки и другую информацию по ценным бумагам при помощи специальных ссылок.
Если мы введем такую ссылку в Power Query, создав запрос из интернета, то получим интересующие нас котировки прямо в Excel.
6 Неразмеченный текст Вы делаете запрос к Web-странице и сталкиваетесь с неразмеченным текстом. Вы хотите при помощи Power Query этот неразмеченный текст преобразовать в нормальную красивую таблицу.
7 Текстовый документ, веб-страница, List.Zip В этом запросе мы научимся получать нужную информацию из текста веб-страницы.
8 Youtube Data API В этом уроке мы научимся получать данные из Youtube Data API. Узнаем как получить данные о Youtube канале: список видео и плейлистов, названия, описания, длительность, тэги, количество лайков, дизлайков, просмотров и комментариев.
9 Личный OneDrive — подключаемся напрямую к файлам и папкам В этом уроке мы разберем как напрямую подключиться к файлам и папкам на личном OneDrive.
10 Подключение Google Spreadsheets, Google Drive (Excel.Workbook, Web.Contents) В этом уроке мы научимся подключаться к xlsx файлам, которые находятся в вашем Google Drive.
11 Получить все станции метро Получим таблицу с перечнем станций метрополитена даже с координатами широты и долготы.
12 Получить ссылки с веб-страницы (Html.Table) Получить URL с веб-страницы. Сделать запрос к каждому URL, получить таблицы и объединить их всех по вертикали.
13 Получить все URL с веб-страницы Получим нужные URL с веб-страницы в Excel. Сделать запрос к каждому URL, получить таблицы и объединить их по вертикали.
14 Ищем работу через API Head Hunter (hh.ru) Получим таблицу с перечнем вакансий с сайте HH. Получим вакансии, в названии или описании которых встречаются слова SQL, Pandas, Power Query, Power Pivot, Power BI.
15 Запрос к XML Sitemap Сделаем запрос к sitemap.xml, чтобы извлечь список всех веб-страниц сайта.

Время прочтения: 4 мин.

Довольно часто, при аудите сервисов, работающих с внешними финансовыми потоками, возникает необходимость оценки корректности получения, обработки и хранения внешней информации в СУБД компании. Одним из таких примеров является аудит системы биржевой торговли Quik. Для анализа необходима информация о котировках ценных бумаг за продолжительный период времени с различной детализацией (от минуты до дня). Разумеется, требуется информация не об одной или двух котировках, а о десятках или сотнях. В решении данной проблемы поможет python библиотека apimoex, предоставляемая непосредственно Московской биржей, которая доступна по следующей ссылке.

Данные о необходимых котировках и временных интервалах предоставляются в виде excel файла, состоящего из трех колонок: название бумаги, дата, время.

Для начала скачаем необходимые библиотеки, для этого запустим команду:

pip install apimoex requests pandas

После установки необходимых библиотек, импортируем их внутри нашего проекта:

import requests
import apimoex
import pandas as pd
import sys

Далее задаем режим торгов:

board = 'TQBR'

Откроем наш файл с помощью модуля pandas и производим препроцессинг данных:

df_excel = pd.read_excel(“path to excel file”)
column_name = [i for i in df_excel]
df_excel[column_name[1]] = df_excel[column_name[1]].map(str).map(lambda x: x[:10])
df_cotir = df_excel.drop_duplicates(subset=[column_name[0], column_name[1]])
df_cotir[column_name[0]] = df_cotir[column_name[0]].map(str)
ticks = [line.rstrip() for line in df_cotir[column_name[0]]]
dates = [line.rstrip() for line in df_cotir[column_name[1]]]

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

Скачивать сами данные будем с помощью функции get_board_candles с параметрами:

  • session – Сессия интернет соединения
  • security – Тикер ценной бумаги
  • interval – Размер свечки — целое число 1 (1 минута), 10 (10 минут), 60 (1 час), 24 (1 день), 7 (1 неделя), 31 (1 месяц) или 4 (1 квартал). По умолчанию дневные данные
  • start – Дата вида ГГГГ-ММ-ДД. При отсутствии данные будут загружены с начала истории
  • end – Дата вида ГГГГ-ММ-ДД. При отсутствии данные будут загружены до конца истории. Для текущего дня будут загружены не окончательные данные, если торги продолжаются
  • columns – Кортеж столбцов, которые нужно загрузить — по умолчанию момент начала свечки и HLOCV. Если пустой или None, то загружаются все столбцы
  • board – Режим торгов — по умолчанию основной режим торгов T+2
  • market – Рынок — по умолчанию акции
  • engine – Движок — по умолчанию акции

Далее открываем сессию для экспорта котировок сохраняем полученные результаты в список из pandas DataFrame:

tick_history, process = list(), 0
with requests.Session() as session:
    for i in range(len(ticks)):
        process = process + 1
        print((process / len(ticks)) * 100, '%', process)
        data = apimoex.get_board_candles(session, security=ticks[i], interval=1, start=dates[i], end=dates[i], board=board, market=market_type)
        if data == []:
            continue
        df = pd.DataFrame(data)
        df['TICKER'] = ticks[i]
        cols = df.columns.tolist()
        cols = cols[-1:] + cols[:-1]
        df = df[cols]
        tick_history.append(df)

Далее объединяем список котировок в pandas DataFrame и преобразовываем колонку с временем и датой в две:

df_finale = pd.concat(tick_history)
df_finale['begin'] = pd.DataFrame(df_finale['begin'])
df_finale['date'] = df_finale['begin'].map(lambda x: x[:10])
df_finale['time'] = df_finale['begin'].map(lambda x: x[11:])

Остается выбрать данные с необходимым нам временем:

cols = df_finale.columns.tolist()
cols = cols[:1] + cols[-2:] + cols[1:-2]
df_finale = df_finale[cols]
df_finale.drop('begin', 1)
df_finale['date'] = df_finale['date'].map(str)
df_finale["time"] = df_finale["time"].map(str).map(lambda x: x[:5])
df_excel = df_excel.rename({column_name[2]: "time", column_name[1]: 'date', column_name[0]: 'TICKER'}, axis=1)
df_finale = pd.merge(df_finale, df_excel[['TICKER', 'date', "time"]], on=['TICKER', 'date', "time"], how='inner')

В конце, сохраняем результат в csv файл:

df_finale.drop_duplicates().to_csv("result.csv", index=False, sep='|')

Загруженные данные можно агрегировать до нужных таймфреймов:

import datetime
def add_delta(tme, delta=1):
    if tme != None:
        tme =list(map(int, tme.split(':')))
        tme = datetime.time(tme[0],tme[1],0)
        return (datetime.datetime.combine(datetime.date.today(), tme) + datetime.timedelta(minutes=delta)).time()

timewindow = datatime.time (hours = 13, minutes = 43)
df_hour_frame = df_finale[(df_finale ['time'] >= timewindow) & (df_finale['time'] <= add_delta(timewindow, datatime.timedelta(minutes = 60))]
df_hour_frame['low in range'] = df_hour_frame['low'].min()
df_hour_frame['high in range'] = df_hour_frame['high'].max()
df_hour_frame['max value in range'] = df_hour_frame['value'].max()
df_hour_frame['min value in range'] = df_hour_frame['value'].min()

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

Содержание

  1. Power Query Веб-запросы №5. Котировки Московской биржи
  2. Описание
  3. Решение
  4. Что делает Free API Московской биржи в Google Таблицах
  5. API Московской биржи в формулах Google Таблиц
  6. Идентификатор режима торгов
  7. Автоматическое получение имени инструмента с Московской биржи по его идентификатору
  8. Автоматическое получение цены инструмента с Московской биржи по его идентификатору
  9. Автоматическое получение даты следующего купона и его значения с Московской биржи по идентификатору облигации
  10. Автоматическое получение дивидендной доходности на конкретную дату с Московской биржи по идентификатору облигации
  11. Автоматическое получение дат оферт с Московской биржи по идентификатору облигации
  12. Учет инвестиций в гугл-таблицах №2 — получаем котировки акций и ETF с Мосбиржи
  13. Котировки российских акций
  14. Получаем цену ETF и БПИФ в рублях / долларах и евро
  15. Цена иностранных акций на Мосбирже
  16. Настройка таблицы или возможные проблемы
  17. Нужно знать
  18. Готовый шаблон
  19. Что делает Free API Московской биржи в Google Таблицах
  20. API Московской биржи в формулах Google Таблиц
  21. Идентификатор режима торгов
  22. Автоматическое получение имени инструмента с Московской биржи по его идентификатору
  23. Автоматическое получение цены инструмента с Московской биржи по его идентификатору
  24. Автоматическое получение даты следующего купона и его значения с Московской биржи по идентификатору облигации
  25. Автоматическое получение дивидендной доходности на конкретную дату с Московской биржи по идентификатору облигации
  26. Автоматическое получение дат оферт с Московской биржи по идентификатору облигации

Power Query Веб-запросы №5. Котировки Московской биржи

Описание

В этом уроке мы научимся получать прямо в Excel котировки разных ценных бумаг с сайта Московской биржи.

Решение

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

Если мы введем такую ссылку в Power Query, создав запрос из интернета, то получим интересующие нас котировки прямо в Excel.

Вот ссылка на сайте Московской биржи https://iss.moex.com/iss/reference/ На этой странице вы можете увидеть какую именно информацию вы можете получить с сайта Московской биржи. Котировками дело не ограничивается.

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

Наша ссылка будет выглядеть так — https://iss.moex.com/iss/history/engines/stock/markets/shares/securities/SBER/securities.xml

В том месте, где написано SBER нужно вставить тикер интересующей вас ценной бумаги. Далее, развернув таблицу, вы получите таблицу с котировками, но только 100 строк. Это максимальное количество, которое позволено выгружать. Нам нужно что-то придумать, чтобы выгружать больше строк.

Что делать, чтобы получить много строк? Нужно использовать параметр start. Мы создадим столбец с числами с инкрементом 100 и в каждой строке будем запрашивать информация по ссылке.

Источник

Что делает Free API Московской биржи в Google Таблицах

Количество частных инвесторов на Московской бирже удвоилось за последний год и составило 3,86 млн: за 2019 счета на Мосбирже открыли 1,9 млн человек. Санкт-Петербургская биржа, специализирующаяся на торгах акциями иностранных компаний, в прошлом году зафиксировала трехкратный прирост счетов – с 910 000 до 3,06 млн шт.

Это означает, что на рынок пришло почти 2 млн новичков, которые никогда не занимались трейдингом и не использовали специализированный софт для торгов и учета позиций.

И если мобильные приложения брокеров для торгов постоянно обновляются и в целом достаточно удобны для пользователей, то учёт позиций, особенно при использовании нескольких брокеров (счёт от одного, а ИИС от другого) может вызывать вопросы. Бесплатным решением с автоматическим скачиванием котировок и параметров могут быть гугл таблицы с использованием бесплатного API Московской биржи.

Ранее я уже описывал на Хабре возможности при использовании разных приложений (Intuit Quicken, KMyMoney, Microsoft Excel, Google Таблицы) для совокупного учета капитала “в одном окне”.

API Московской биржи в формулах Google Таблиц

Вообще вариантов использования API Мосбиржи два:

Но скрипты в бесплатных документах скорее пугают людей, особенно, если у этих людей есть какие-то инвестиции. И особенно, если они не понимают код скрипта. Поэтому я остановлюсь только на формулах.

В общем виде все запросы, которые можно отправить к API Мосбиржи можно узнать в справочнике. Но лично для меня этот справочник был не очень понятен и я далеко не сразу в нём разобрался, поэтому сделал простую Гугл таблицу с примерами, которые использую сам.

Идентификатор режима торгов

В API Московской биржи очень многое зависит от параметра “Идентификатор режима торгов” (primary_boardid), который можно посмотреть прямо у них на сайте через форму поиска.


Идентификатор режима торгов для акций Сбербанка

Также этот идентификатор можно посмотреть через обычный HTTP-запрос к API:


Идентификатор режима торгов primary_boardid для акций Яндекс

Автоматическое получение имени инструмента с Московской биржи по его идентификатору

Очень удобно, что можно получить полное наименование инструмента. Также можно автоматически получать и краткое наименование инструмента, но полное название более понятно особенно для облигаций.


Гугл таблица с примерами автоматического получения имени для разных классов активов

Автоматическое получение цены инструмента с Московской биржи по его идентификатору

Цены на российские активы можно получать с множества сайтов, но если мы говорим про API Московской биржи, то на этой вкладке представлены актуальные примеры.


Гугл таблица с примерами автоматического получения цен для разных классов активов

Автоматическое получение даты следующего купона и его значения с Московской биржи по идентификатору облигации

По облигациям (не только корпоративным, но также ОФЗ и еврооблигациям) можно автоматически получать дату выплаты следующего купона и его значение.


Гугл таблица с примерами автоматического получения дат и значений купонов

Автоматическое получение дивидендной доходности на конкретную дату с Московской биржи по идентификатору облигации

К сожалению, в одну формулу получить значение дивидендной доходности для облигации на конкретную дату можно получить только для ОФЗ, потому что их список короткий. Для корпоративных облигаций — можно перебирать в скрипте, например, или вручную указывать начальную позицию для поиска.


Гугл таблица с примерами автоматического получение дивидендной доходности на конкретную дату

Автоматическое получение дат оферт с Московской биржи по идентификатору облигации

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


Гугл таблица с примерами автоматического получения дат оферт

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

Также хочу отметить, что никак не связан с Московской биржей и использую ИСС Мосбиржи только в личных интересах, например, для учета собственного капитала.

Автор: Михаил Шардин,
4 февраля 2020 г.

Источник

Учет инвестиций в гугл-таблицах №2 — получаем котировки акций и ETF с Мосбиржи

В прошлой статье мы разобрали способ получения котировок акций ( и ETF) с помощью функции GoogleFinance. Правда по некоторым российским бумагам получении инфы таким образом невозможно. Речь идет о привилегированных акциях (типа Сбера, Татнефти, Сургута) и практически всех российских биржевых фондах (FXIT, VTBX, SBSP и так далее).

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

Котировки российских акций

Для вызова котировок привилегированных акций (впрочем как и обыкновенных) используем формулу следующего вида (все пишется слитно, без пробелов):

= IMPORTxml ( «https://iss.moex.com/iss/engines/stock/markets/shares/boards/TQBR/securities.xml?iss.meta=off&iss.only=marketdata&marketdata.columns=SECID,LAST» , concatenate ( «//row[@SECID=’» , B5 , «‘]/@LAST» ) )

В формуле B5 (выделено красным) — это адрес ячейки, где прописан тикер акции (у вас адрес может быть другим). В остальном формула остается неизменной для всех российских акций.

Вот как это выглядит в таблице:

Получение котировок для российских привилегированных акций

Дополнительно, чтобы не прописывать руками, можно сделать автоматический вывод названия компании. Мы сразу будем видеть, что формула ничего не путает и отдает нам котировки нужных нам акций.

Для вывода названия акций (компании) используем формулу:

= IMPORTxml ( «https://iss.moex.com/iss/engines/stock/markets/shares/boards/TQBR/securities.xml?iss.meta=off&iss.only=securities&securities.columns=SECID,SECNAME» , concatenate ( «//row[@SECID=’» , B5 , «‘]/@SECNAME» ) )

Также при необходимости меняем только адрес ячейки с тикером (в моей формуле — это B5).

Получаем цену ETF и БПИФ в рублях / долларах и евро

Если мы захотим получить котировки российских биржевых фондов по вышеописанной формуле, просто заменив тикер акции на тикер ETF (или БПИФ), то нас постигнет фиаско. Формула будет выдавать ошибку.

Для биржевых фондов нужна формула следующего вида:

= IMPORTxml ( «https://iss.moex.com/iss/engines/stock/markets/shares/boards/TQTF/securities.xml?iss.meta=off&iss.only=marketdata&marketdata.columns=SECID,LAST» , concatenate ( «//row[@SECID=’» , B14 , «‘]/@LAST» ) )

Как всегда, при необходимости меняем адрес ячейки с тикером.

Получаем название и котировки российских биржевых фондах в Гугл-таблицах

На первый взгляд формулы для акций и ETF абсолютно идентичны. Правда есть небольшое отличие всего в четыре буквы. Для вызова акций мы использовали в формуле TQBR, а для ETF — заменили на TQTF.

Что это за зверь такой?

TQBR или TQTF — это идентификатор режима торгов. Узнать его можно на сайте Мосбирже. Идентификатор прописывается в карточку каждого инструмента. Для примера возьмем ETF FXRU. Находим его через поиск на сайте бирже. И видим TQTF.

Соответственно прописываем в формулу нужный идентификатор.

Дабы сэкономить читателю время, в формуле вызова котировок используем идентификатор:

  • для акций — TQBR;
  • для рублевых ETF — TQTF;
  • для ETF с расчетам в евро — TQTE;
  • для ETF с расчетам в долларах — TQTD.

Для автоматического получения названия фонда по тикеру, в формуле соответственно также нужно поменять идентификатор.

В таблице накидал несколько примеров вызова цен по валютным фондам.

Выводим котировки биржевых фондов РФ в долларах и евро

Цена иностранных акций на Мосбирже

На Московской бирже обращаются иностранные акции, номинированные в рублях.

В отличии от оригинала, они имеют тикер дополненный «-RM». То есть для Apple, рублевый тикер будет AAPL-RM, для Facebook вместо FB — пишем FB-RM и так далее.

Формула вызова котировок имеет следующий вид:

= IMPORTxml ( «https://iss.moex.com/iss/engines/stock/markets/ foreignshares /boards/ FQBR /securities.xml?iss.meta=off&iss.only=marketdata&marketdata.columns=SECID,LAST» , concatenate ( «//row[@SECID=’» , B47 , «‘]/@LAST» ) )

Красным пометил отличия от предыдущих формул:

  • Как обычно — меняем адрес ячейки с тикером под себя.
  • Рублевые иностранные акции имеют идентификатор торгов — FQBR
  • Вместо shares ставим foreignshares (иностранные ценные бумаги).

Настройка таблицы или возможные проблемы

Иногда про получении данных о котировках по API (по вышеописанным формулам) может выходить ошибка. Часто причина ошибки — неправильные настройки таблицы. Данные передаются в формате дробных чисел с точкой (например — 0.55). В настройках вашей таблицы может по умолчанию стоит отображение чисел с запятой (0,55).

Для исправлении ошибки выбираем в меню «Файл->Настройки таблицы».

На вкладке «Общие» в поле Региональные настройки» нужно выбрать Соединенные Штаты.

Нужно знать

Не забываем про задержку во времени. Так же как и ГуглФинанс, котировки по API Мосбиржи подгружаются примерно с 20 минутным опозданием.

На открытии торгов Мосбиржи (в 10 утра по МСК) — некоторое время все (или многие) котировки могут быть недоступны и формула будет выдавать ошибку.

В приоритете (там где это возможно) лучше использовать функцию GoogleFinfnce. Если в таблице много инструментов, то загрузка по API может быть очень долгой. В этом плане Гуглфинанс работает пошустрее. Поэтому используем API Мосбиржи только там, где Гугл бессилен: префы российских компаний и биржевые фонды.

Для акций у которых котировки рассчитываются до более 2-х знаков после запятой, тоже лучше использовать API. В этом случае цена будет передаваться более точная.

Как пример, акции ВТБ. Текущие котировки — 0.04244. GoogleFinance округлит цену до 0.04.

Из подобного есть еще Русал, ИнтерРао, Русгидро, АФК Система, Россети, ФСК ЕЭС и много чего еще.

Готовый шаблон

Как всегда прикладывают файл-шаблон со всеми прописанными формулами. Таблица только для просмотра. Для использования сохраните себе копию (в верхнем меню: «Файл — > Создать копию»).

Комментарии, замечания, пожелания приветствуются!

В третьей части будем автоматически выдергивать информацию по дивидендам российских акций.

Как оказалось после публикации статьи — при копировании формул вызова котировок выходила ошибка. Проблема заключалась в неправильном отображении блогом кавычек. Вместо двойных кавычек (сверху и снизу по две запятых » . текст. » система отображала французские (или кавычки-елочки). А для гугл-таблиц — это ошибка. Сейчас настроил правильное отображение и все работает.

Всем огромное спасибо за замечания!

Источник

Что делает Free API Московской биржи в Google Таблицах

Количество частных инвесторов на Московской бирже удвоилось за последний год и составило 3,86 млн: за 2019 счета на Мосбирже открыли 1,9 млн человек. Санкт-Петербургская биржа, специализирующаяся на торгах акциями иностранных компаний, в прошлом году зафиксировала трехкратный прирост счетов – с 910 000 до 3,06 млн шт.

Это означает, что на рынок пришло почти 2 млн новичков, которые никогда не занимались трейдингом и не использовали специализированный софт для торгов и учета позиций.

И если мобильные приложения брокеров для торгов постоянно обновляются и в целом достаточно удобны для пользователей, то учёт позиций, особенно при использовании нескольких брокеров (счёт от одного, а ИИС от другого) может вызывать вопросы. Бесплатным решением с автоматическим скачиванием котировок и параметров могут быть гугл таблицы с использованием бесплатного API Московской биржи.

Ранее я уже описывал на Хабре возможности при использовании разных приложений (Intuit Quicken, KMyMoney, Microsoft Excel, Google Таблицы) для совокупного учета капитала “в одном окне”.

А сейчас я бы хотел остановиться именно на программном интерфейсе к информационно-статистическому серверу Московской Биржи (ИСС / ISS).

API Московской биржи в формулах Google Таблиц

Вообще вариантов использования API Мосбиржи два:

Но скрипты в бесплатных документах скорее пугают людей, особенно, если у этих людей есть какие-то инвестиции. И особенно, если они не понимают код скрипта. Поэтому я остановлюсь только на формулах.

В общем виде все запросы, которые можно отправить к API Мосбиржи можно узнать в справочнике. Но лично для меня этот справочник был не очень понятен и я далеко не сразу в нём разобрался, поэтому сделал простую Гугл таблицу с примерами, которые использую сам.

Идентификатор режима торгов

В API Московской биржи очень многое зависит от параметра “Идентификатор режима торгов” (primary_boardid), который можно посмотреть прямо у них на сайте через форму поиска.


Идентификатор режима торгов для акций Сбербанка

Также этот идентификатор можно посмотреть через обычный HTTP-запрос к API:


Идентификатор режима торгов primary_boardid для акций Яндекс

Автоматическое получение имени инструмента с Московской биржи по его идентификатору

Очень удобно, что можно получить полное наименование инструмента. Также можно автоматически получать и краткое наименование инструмента, но полное название более понятно особенно для облигаций.


Гугл таблица с примерами автоматического получения имени для разных классов активов

Автоматическое получение цены инструмента с Московской биржи по его идентификатору

Цены на российские активы можно получать с множества сайтов, но если мы говорим про API Московской биржи, то на этой вкладке представлены актуальные примеры.


Гугл таблица с примерами автоматического получения цен для разных классов активов

Автоматическое получение даты следующего купона и его значения с Московской биржи по идентификатору облигации

По облигациям (не только корпоративным, но также ОФЗ и еврооблигациям) можно автоматически получать дату выплаты следующего купона и его значение.


Гугл таблица с примерами автоматического получения дат и значений купонов

Автоматическое получение дивидендной доходности на конкретную дату с Московской биржи по идентификатору облигации

К сожалению, в одну формулу получить значение дивидендной доходности для облигации на конкретную дату можно получить только для ОФЗ, потому что их список короткий. Для корпоративных облигаций — можно перебирать в скрипте, например, или вручную указывать начальную позицию для поиска.


Гугл таблица с примерами автоматического получение дивидендной доходности на конкретную дату

Автоматическое получение дат оферт с Московской биржи по идентификатору облигации

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


Гугл таблица с примерами автоматического получения дат оферт

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

Также хочу отметить, что никак не связан с Московской биржей и использую ИСС Мосбиржи только в личных интересах.

Автор: Михаил Шардин,
4 февраля 2020 г.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Источник

Обновлено: 12.04.2023

Ранее уже писал про получение данных с Московской биржи через формулы Google Таблиц. Однако остался вопрос — можно ли получать эти же данные при локальном использовании Microsoft Excel или его свободного аналога LibreOffice Calc? Без использования скриптов или ручного копирования.

Microsoft Excel с формулами получения данных с Мосбиржи

И на этот вопрос можно дать положительный ответ. Это даже более удобно, поскольку не приходится ожидать загрузки результатов работы функции IMPORTXML в Гугл Таблицах.

Аналогом этой функции в Excel и Calc выступает связка формул: WEBSERVICE (ВЕБСЛУЖБА) + FILTERXML (ФИЛЬТР.XML).

При работе с Microsoft Excel есть некоторые нюансы:

  • Эти функции доступны только в Excel 2013 и более поздних версиях для Windows.
  • Эти функции не будет возвращать результаты на компьютере Mac.
  • Требуется LibreOffice 4.2 и выше.
  • Нет ограничений на используемую ОС. Работает под:
    Windows
    Linux
    Mac OS
  • Файл Excel .xlsx открывается и работоспособен, но визуально форматирование может быть нарушено.

Протестировал этот файл в Microsoft Excel 2019 под Windows 10 и в LibreOffice Calc 6.4 под Linux Mint 19.3. Под Mac OS у меня возможности протестировать не было.

Идентификатор режима торгов

В API Московской биржи очень многое зависит от параметра «Идентификатор режима торгов» (primary_boardid), который можно посмотреть прямо у них на сайте через форму поиска.

Идентификатор режима торгов для акций Тинькофф

Автоматическое получение имени акций, облигаций и ETF

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

Файл « API Мосбиржи в Microsoft Excel.xlsx » с примерами автоматического получения имени для разных классов активов. Корректно работает и в LibreOffice Calc

Автоматическое получение текущих цен

На этой вкладке представлены актуальные примеры для получения цен акций, облигаций и ETF с Московской биржи.

Цена предыдущего дня берётся через PREVADMITTEDQUOTE, а не LAST с 15 минутной задержкой, поскольку по некоторым низко ликвидным инструментам через LAST цены может просто не быть.

Файл « API Мосбиржи в Microsoft Excel.xlsx » с примерами автоматического получения имени для разных классов активов. Корректно работает и в LibreOffice Calc

Автоматическое получение дивидендных выплат для акций

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

Файл « API Мосбиржи в Microsoft Excel.xlsx » с примерами автоматического получения имени для разных классов активов. Корректно работает и в LibreOffice Calc

Автоматическое получение облигационных выплат

По облигациям (не только корпоративным, но также ОФЗ и еврооблигациям) можно автоматически получать дату выплаты следующего купона и его значение.

Файл « API Мосбиржи в Microsoft Excel.xlsx » с примерами автоматического получения имени для разных классов активов. Корректно работает и в LibreOffice Calc

Автоматическое получение дат оферт

Удобно планировать собственные финансы, получая даты оферт (дата, в которую инвестор или эмитент имеют право досрочно погасить облигацию по цене номинала) автоматически.

Файл « API Мосбиржи в Microsoft Excel.xlsx » с примерами автоматического получения имени для разных классов активов. Корректно работает и в LibreOffice Calc

UPD. Пользователь mixei подсказывает, что автоматическое обновление настраивается через Параметры — Центр управления безопасностью — вкладка Внешнее содержимое — там надо поставить все флажки где не рекомендуется :) Но это на страх и риск пользователей.

API Московской биржи предоставляет широкие возможности, которые гораздо шире чем описанные в данной статье. Это статья своеобразная шпаргалка для долгосрочного частного инвестора, который ведёт учёт в локальном файле на собственном компьютере.

Также хочу отметить, что я никак не связан с Московской биржей и использую ИСС Мосбиржи только в личных интересах.

Вы можете использовать пакет средств разработки XLL для Microsoft Excel 2013 и API C, чтобы создавать высокопроизводительные функции обработки листов в Excel 2013. Обновления API C для Excel 2013 отражают постоянную поддержку пользователей, для которых производительность сторонних или внутренних функций играет важную роль.

Программные интерфейсы Excel

В программе Excel доступны несколько вариантов разработки приложений, которые с ней взаимодействуют. Программные интерфейсы Excel добавлялись в предыдущие версии в следующем порядке:

Макроязык XLM: первый доступный пользователям язык для расширения возможностей Excel и основа API C. Хотя язык XLM по-прежнему поддерживается в Excel 2010, ему на замену пришел язык Visual Basic для приложений (VBA).

API C и XLL: библиотеки DLL, интегрируемые с Excel. Они предоставляют интерфейс для непосредственного и самого быстрого добавления высокопроизводительных функций обработки листов, но использовать их сложнее, чем последующие технологии.

VBA: объекты кода Visual Basic, связанные с объектами книги Excel. VBA позволяет перехватывать события, настраивать и добавлять определяемые пользователем функции и команды. VBA — это наиболее распространенный и самый простой вариант расширения возможностей Excel.

Модель COM: стандарт взаимодействия для приложений Windows, с помощью которого Excel предоставляет свои события и объекты. VBA использует модель COM для взаимодействия с Excel. Excel экспортирует библиотеки типов COM, которые помогают создавать ресурсы кода COM и приложения на C++, управляющие Excel.

Причины для использования C API

Основная причина написания XLL и использования API C — создание высокопроизводительных функций для обработки листов. Хотя функции XLL часто называют определяемыми пользователем функциями, время для изучения и обретения необходимых навыков делает эту технологию непрактичной для большинства пользователей. Но возможность применять высокопроизводительные функции, а также создавать в Excel 2013 многопоточные интерфейсы для мощных серверных ресурсов делает ее очень важной частью вариантов расширения Excel.

Версия C API, представленная в Excel 2007, относится, в основном, к высокопроизводительным расчетам, а не пользовательскому интерфейсу.

Написание высокопроизводительных определяемых пользователем функций для работы с листами

API C для Excel — это идеальный выбор для создания высокопроизводительных функций обработки листов с помощью надстроек XLL. API C предоставляет прямой доступ к данным листов. XLL предоставляют Excel прямой доступ к ресурсам DLL. Производительность XLL повышена в Excel 2013 за счет добавления новых типов данных и, что еще важнее, за счет поддержки выполнения определяемых пользователем функций на кластерных серверах.

Доступ к многопоточным серверам с помощью функций XLL

Многопоточный пересчет (MTR), впервые появившийся в Excel 2007, позволяет создавать потокобезопасные функции листа XLL. Их можно использовать для доступа к многопоточным серверам. В следующих разделах более подробно описывается, как это может значительно увеличить наблюдаемую производительность. Для пользователей Excel, которым иногда требуется доступ к мощным вычислительным ресурсам, сочетание библиотеки XLL, использующей MTR, и мощного сервера обеспечивает высокую производительность решения.

Настройка пользовательского интерфейса Excel

Для многих версий Excel интерфейс C API не был лучшим выбором для настройки пользовательского интерфейса. VBA предоставляет эффективный доступ к объектам и событиям Excel. Пользовательский интерфейс, впервые представленный в Excel 2007, существенно отличается от предыдущих версий как внешним видом, так и базовой технологией. Этот интерфейс лучше всего можно настроить с помощью ресурсов управляемого кода.

Создание приложений, доступных в Интернете

Управление Excel из внешних приложений

Асинхронный вызов Excel

Excel позволяет библиотеке XLL вызывать C API, только если приложение Excel передало управление XLL. Функция листа, которую вызывает Excel, может осуществлять обратный вызов Excel с помощью C API. Команда XLL, которую вызывает приложение Excel, может вызывать C API. Функции и команды DLL и XLL, которые вызываются VBA после вызова VBA приложением Excel, могут вызывать C API. Невозможно, например, задать обратный вызов Windows с указанием времени в библиотеке XLL и вызвать из нее C API. Кроме того, невозможно вызвать C API из фонового потока, созданного библиотекой XLL. Не рекомендуется вызывать Excel асинхронно с помощью модели COM из DLL или XLL.

Это очень ограничивают ваши возможности, так как некоторые приложения должны реагировать на события асинхронно. Например, вам может потребоваться получить часть данных в Excel из Интернета и повторно проводить вычисления при каждом изменении данных. Или вам может понадобиться фоновый поток для вычислений и пересчитать данные в Excel после его завершения.

Для этого с помощью Excel можно активно запрашивать изменения, но это неэффективно и непрактично, так как Excel часто будет прерывать регулярные операции. Вы можете настроить повторяющиеся запланированные команды, используя C API или VBA, хотя это не идеальное решение.

В идеальном случае требуется более эффективный внешний процесс для проверки изменений данных, который активирует Excel для извлечения обновлений и пересчета. Это можно сделать с помощью приложения, которое взаимодействует с Excel с помощью модели COM. В отличие от интерфейса C API, с помощью которого вызовы можно осуществлять, только если приложение Excel явно передало управление, модель COM не так ограничена. Приложения COM могут вызывать методы Excel всякий раз, когда Excel находится в состоянии готовности, несмотря на то, что эти вызовы могут игнорироваться, если отображаются диалоговые окна, открываются меню или выполняется макрос.

Интерфейс C API и его связь с XLM

Макроязык Excel (XLM) был первой доступной пользователям средой программирования в Excel. Она позволяет создавать специальные команды и функции на специальных листах макросов, которые похожи на обычные листы. Листы макросов XLM по-прежнему поддерживаются в Excel 2013. На листе макросов можно использовать все обычные функции листов, такие как СУММ и LOG, а также следующие элементы, которые невозможно ввести на листе:

функции, предоставляющие сведения о рабочей области, такие как GET.CELL и GET.WORKBOOK;

эквивалентные командам функции, позволяющие автоматизировать обычные пользовательские операции, такие как DEFINE.NAME и PASTE;

функции, связанные с надстройками, такие как REGISTER;

эквивалентное командам перехватывание событий (например, с помощью ON.ENRTY и ON.TIME);

операции макросов, связанные с функциями, такие как ARGUMENT и VOLATILE;

операции управления потоком выполнения, такие как GOTO и RETURN.

Ограниченная версия API C существовала в Excel версии 3. Однако в Excel версии 4 язык XLM был сопоставлен с интерфейсом API C. С тех пор библиотеки DLL могут вызывать все функции листа, информационные функции листа макросов, команды, даже перехватывать события. DLL не могут вызывать функции управления потоком XLM из API C. Эти команды и функции листа макроса описаны в файле справки XLMacr8.hlp (прежнее название — Macrofun.hlp). Для получения этого файла справки перейдите в Центр загрузки Майкрософт и выполните поиск «XLMacr8.hlp».

Windows Vista и Windows 7 не поддерживают HLP-файлы напрямую, но вы можете скачать программу справки Windows (WinHlp32.exe) для Windows Vista или программу справки Windows (WinHlp32.exe) для Windows 7 от корпорации Майкрософт, позволяющие открыть эти файлы.

Библиотеки DLL вызывают эквиваленты этих функций и команд интерфейса API C, используя функции обратного вызова Excel4, Excel4v, Excel12 и Excel12v (последние две были представлены в Excel 2007). Перечисленные константы, соответствующие каждой функции и команде, определены в файле заголовка и передаются как один из аргументов функциям обратного вызова. Например, функция GET.CELL представлена xlfGetCell, REGISTER — xlfRegister, а DEFINE.NAME — xlcDefineName.

Помимо функций листа, а также команд и функций листа макросов, API C предоставляет перечисления функций и команд, которые можно вызывать только с помощью этих функций обратного вызова из DLL. Например, xlGetName позволяет DLL найти собственный полный путь и имя файла, что необходимо при регистрации функций и команд в Excel.

После представления листов Visual Basic для приложений (VBA) в Excel версии 5 и редактора Visual Basic (VBE) в версии 8 (Excel 97) самым простым способом настройки Excel стал язык VBA, а не XLM. Множество новых возможностей, представленных в последующих версиях Excel, доступны через VBA, но не через XLM или C API. Например, несколько команд, прерывания событий и расширенные возможности диалогового окна функции доступны в VBA, но не в XLM или C API.

В этой статье описано, как использовать модель API для создания надстроек в Excel, Word и OneNote. Здесь представлены основные понятия, лежащие в основе использования API на основе обещаний.

Эта модель не поддерживается клиентами Office 2013. Используйте общую модель API для работы с этими версиями Office. Полные сведения о доступности платформ см. в статье Доступность клиентских приложений и платформ Office для надстроек Office.

В примерах на этой странице используются API JavaScript для Excel, но эти понятия также относятся к API JavaScript для OneNote, Visio и Word.

Асинхронный характер API на основе обещаний

Надстройки Office — это веб-сайты, отображающиеся внутри контейнера браузера в приложениях Office, таких как Excel. Этот контейнер внедряется в приложение Office на платформах для классических ПК, например Office для Windows, и запускается в элементе iFrame HTML в Office для Интернета. Из-за соображений производительности интерфейсы API Office.js не могут синхронно взаимодействовать с приложениями Office на всех платформах. Таким образом, вызов API sync() в Office.js возвращает обещание, которое разрешается, когда приложение Office выполняет запрошенные действия чтения или записи. Кроме того, вы можете поместить в очередь несколько действий, например действия настройки свойств или вызова методов, а затем запустить их в виде пакета команд в одном вызове метода sync() , а не отправлять отдельные запросы для каждого действия. В разделах ниже описано, как сделать это, используя API run() и sync() .

Контекст запроса

Прокси-объекты

Объекты JavaScript для Office, объявляемые и используемые с помощью API на основе обещаний, являются прокси-объектами. Все методы, которые вы вызываете, либо свойства, которые вы настраиваете либо загружаете, в прокси-объектах просто добавляются в очередь команд, ожидающих выполнения. Когда вы вызываете метод sync() в контексте запроса (например, context.sync() ), команды, помещенные в очередь, передаются в приложение Office и выполняются. По существу, эти API ориентированы на работу с пакетами. Вы можете поместить в очередь любое количество изменений в контексте запроса, а затем вызвать метод sync() , чтобы запустить пакет команд, помещенных в очередь.

Например, во фрагменте кода ниже показано, как объявить локальный объект JavaScript Excel.Range ( selectedRange ) для ссылки на выделенный диапазон в книге Excel, а затем задать ряд свойств для этого объекта. Объект selectedRange представляет собой прокси-объект, поэтому свойства, заданные в этом объекте, и метод, вызываемый в этом объекте, не будут отображены в документе Excel, пока надстройка не вызовет метод context.sync() .

Совет по производительности: минимизируйте количество созданных прокси-объектов

Избегайте повторного создания одного и того же прокси-объекта. Вместо этого, если вам нужен одинаковый прокси-объект для нескольких операций, создайте его один раз и назначьте его переменной, а затем используйте эту переменную в своем коде.

При вызове метода sync() в контексте запроса будет синхронизировано состояние прокси-объектов и объектов в документе Office. Метод sync() запускает любые команды, помещенные в очередь в контексте запроса, и получает значения для любых свойств, которые следует загрузить в прокси-объектах. Метод sync() выполняется асинхронно и возвращает обещание, которое разрешается по завершении работы метода sync() .

В примере ниже показана пакетная функция, которая определяет локальный прокси-объект JavaScript ( selectedRange ), загружает свойство этого объекта, а затем использует шаблон обещаний JavaScript для вызова метода context.sync() и, соответственно, синхронизации состояния прокси-объектов и объектов в документе Excel.

В предыдущем примере настроен параметр selectedRange , и его свойство address загружается при вызове context.sync() .

Так как sync() — это асинхронная операция, всегда следует возвращать объект Promise , чтобы завершить операцию sync() , прежде чем продолжить выполнение сценария. Если вы используете TypeScript или JavaScript ES6+, вы можете await вызов context.sync() вместо возврата обещания.

Совет по производительности: минимизируйте количество вызовов синхронизации

В API JavaScript для Excel sync() является единственной асинхронной операцией и в некоторых обстоятельствах может выполняться медленно, особенно в случае с Excel в Интернете. Для оптимизации производительности минимизируйте количество вызовов sync() , поставив в очередь максимально возможное количество изменений до ее вызова. Дополнительные сведения об оптимизации производительности с помощью sync() см. в статье Избегайте использования метода context.sync в циклах.

Чтобы можно было считывать свойства прокси-объекта, вам необходимо явно загрузить их и заполнить прокси-объект данными из документа Office, а затем вызвать метод context.sync() . Например, вы создали прокси-объект для ссылки на выделенный диапазон, а затем вам потребовалось считать свойство address выделенного диапазона. Прежде чем вы сможете считать свойство address , вам потребуется загрузить его. Чтобы запросить загрузку свойств прокси-объекта, вызовите метод load() в объекте и укажите свойства, которые необходимо загрузить. В следующем примере показана загрузка свойства Range.address для myRange .

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

Аналогично запросам для задания свойств или вызова методов в прокси-объектах, запросы на загрузку свойств в прокси-объектах добавляются в очередь команд, ожидающих выполнения, в контексте запроса, который будет запущен, когда вы в следующий раз вызовете метод sync() . В очередь можно поставить сколько угодно вызовов load() в контексте запроса.

Скалярные и навигационные свойства

Существует две категории свойств: скалярные и навигационные. К скалярным свойствам относятся назначаемые типы, такие как строки, целые числа и структуры JSON. Свойства навигации — это объекты и коллекции объектов только для чтения, которым назначаются поля вместо прямого назначения свойства. Например, элементы name и position объекта Excel.Worksheet являются скалярными свойствами, а protection и tables — свойствами навигации.

Надстройка может использовать свойства навигации в качестве пути для загрузки определенных скалярных свойств. Следующий код помещает в очередь команду load для имени шрифта, используемого объектом Excel.Range , без загрузки каких-либо других сведений.

Вы также можете задавать скалярные свойства из свойства навигации по пути к ним. Например, вы можете задать размер шрифта для Excel.Range с помощью команды someRange.format.font.size = 10; . Чтобы задать свойство, необязательно загружать его.

Имейте в виду, что некоторые свойства объекта могут совпадать с именем другого объекта. Например, format — это свойство объекта Excel.Range , но также имеется и объект format . Поэтому если вы, например, вызываете range.load(«format») , это эквивалентно range.format.load() (нежелательный пустой оператор load() ). Чтобы избежать этого, ваш код должен загружать только «конечные узлы» в дереве объектов.

Вызов метода load без параметров (не рекомендуется)

Если вызвать метод load() для объекта (или коллекции), не указывая параметры, будут загружены все скалярные свойства объекта или объектов в коллекции. Загрузка ненужных данных замедлит вашу надстройку. Необходимо всегда явным образом указывать свойства для загрузки.

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

ClientResult

Методы в API на основе обещаний, возвращающие примитивные типы, используют шаблон, похожий на парадигму load / sync . Например, Excel.TableCollection.getCount получает количество таблиц в коллекции. getCount возвращает ClientResult<number> . Это означает, что свойство value возвращаемого ClientResult выражено числом. Сценарий не может получить доступ к этому значению, пока не вызовет context.sync() .

Следующий код получает общее количество таблиц в книге Excel и записывает его в консоль.

Установка свойств объекта с вложенными свойствами навигации может быть трудоемкой задачей. Вместо того чтобы задавать отдельные свойства с помощью путей навигации, как описано выше, вы можете использовать метод object.set() , доступный для объектов в API JavaScript на основе обещаний. С помощью этого метода можно задать сразу несколько свойств объекта, передавая другой объект того же типа Office.js или объект JavaScript со свойствами, сходными по структуре со свойствами объекта, для которого вызывается метод.

В приведенном ниже примере кода показано, как задать несколько свойств формата диапазона, вызвав метод set() и передав в него объект JavaScript, имена и типы свойств которого повторяют структуру свойств объекта Range . В этом примере предполагается, что данные находятся в диапазоне B2:E2.

Некоторые свойства невозможно задать напрямую

Некоторые свойства невозможно задать, хотя они и поддерживают запись. Эти свойства являются частью родительского свойства, которое должно быть задано как один объект. Это связано с тем, что родительское свойство использует вложенные свойства с определенными логическими связями. Эти родительские свойства должны быть заданы с помощью нотации литерала объекта, чтобы задать весь объект, а не отдельные вложенные свойства этого объекта. Один из примеров доступен в разделе PageLayout. Свойство zoom должно быть установлено с помощью одного объекта PageLayoutZoomOptions, как показано здесь.

В предыдущем примере вы не сможете напрямую присвоить значение zoom : sheet.pageLayout.zoom.scale = 200; . Этот оператор выдает ошибку, так как zoom не загружен. Даже если zoom загружен, масштабный набор не будет работать. Все контекстные операции происходят в zoom , обновляя прокси-объект в надстройке и переписывая локально установленные значения.

Это поведение отличается от свойств навигации, например Range.format. Свойства объектов format можно установить с помощью объектной навигации, как показано здесь.

Вы можете определить свойство, для которого невозможно напрямую задать его вложенные свойства, путем проверки модификатора только для чтения. Для всех свойств, доступных только для чтения, можно напрямую задать их вложенные свойства, использующиеся не только для чтения. Записываемые свойства, например PageLayout.zoom , должны быть заданы на уровне объекта. Сводка:

  • Свойство только для чтения: вложенные свойства можно задать с помощью навигации.
  • Записываемое свойство: вложенные свойства нельзя задать с помощью навигации (необходимо установить их в рамках начального назначения родительского объекта).

Методы и свойства *OrNullObject

Некоторые методы и свойства доступа создают исключение, если нужный объект не существует. Например, если для получения листа Excel указать имя листа, не существующее в книге, метод getItem() создаст исключение ItemNotFound . Библиотеки конкретных приложений позволяют коду проверять наличие сущностей документа, не требуя кода обработки исключений. Это достигается с помощью вариантов методов и свойств *OrNullObject . Эти варианты вместо создания исключения возвращают объект, свойству isNullObject которого присвоено значение true , если указанный элемент не существует.

Например, вы можете вызвать метод getItemOrNullObject() для коллекции, такой как Worksheets, чтобы получить элемент из коллекции. Метод getItemOrNullObject() возвращает указанный элемент, если он существует. В противном случае возвращается объект, свойству isNullObject которого присвоено значение true . Затем код может оценить это свойство, чтобы определить, существует ли объект.

Варианты *OrNullObject никогда не возвращают значение JavaScript null . Они возвращают обычные прокси-объекты Office. Если сущность, представляемая объектом, не существует, свойству isNullObject объекта присваивается значение true . Не проверяйте возвращенный объект на нулевое значение или ложность. Для него никогда не используются значения null , false или undefined .

Работая в IoT-сфере и плотно взаимодействуя с одним из основных элементов данной концепции технологий – сетевым сервером, столкнулся вот с какой проблемой (задачей): необходимо отправлять много запросов для работы с умными устройствами на сетевой сервер. На сервере был реализован REST API с оболочкой Swagger UI, где из графической оболочки можно было отправлять только разовые запросы. Анализ сторонних клиентов, типа Postman или Insomnia показал, что простого визуального способа поместить в скрипт массив из необходимого перечня идентификаторов устройств (или любых других элементов сервера), для обращения к ним – не нашлось.

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

получать информацию по устройствам с различными параметрами фильтрации (GET);

применять изменения в конфигурации по устройствам: имя, профиль устройства, сетевые лицензии и пр. (PUT);

отправлять данные для конфигурации и взаимодействия с устройствами (POST).

И сегодня я расскажу вам про то, как с помощью Excel, пары формул и самописных функций на VBA можно реализовать алгоритм, отправляющий любое необходимое количество REST-API запросов с использованием авторизации Bearer Token.

Данная статья будет полезная тем, кто воспользуется данным решением под Windows, но еще больше она будет полезна тем людям, которые хотят использовать данное решение на MacOS (с Excel x64). Как вы уже догадались, ниже будут рассмотрены два варианта реализации под разные системы, так как с MacOS есть нюанс.

Часть 1. Реализация решения под Windows

GET

Начнем с самого простого: GET – запросов. В данном примере необходимо получить ответ (информацию) от сервера по заданному списку устройств.

Для реализации GET – запросов нам дано:

1) Ссылка, в которой указываются параметры запроса.

2) Заголовки запроса + Токен авторизации (Bearer Token)

—header ‘Accept: application/json’ —header ‘Authorization: Bearer

3) Параметр, указываемый в ссылке (в данном примере это идентификаторы устройств – DevEUI):

Имея такие данные на входе, делаем в Excel лист-шаблон, который заполняем в соответствии с тем, что имеем:

столбец А уходит вот значения параметров

столбец F уходит под ссылку-родителя

столбец H уходит под заголовки, где в ячейке H1 единоразово для текущего листа указывается токен:

=СЦЕП(«—header ‘Accept: application/json’ —header ‘Authorization: Bearer «;$H$1;»‘»)

столбец I уходит под URL (ссылки-дети, на основе ссылки-родителя)

столбец J уходит под результат (ответ от сервера)

Далее, нам необходимо реализовать подпрограмму(макрос) отправки GET-запросов. Состоит она из четырех частей:

цикла, который считает количество строк для работы по листу, пробегая по столбцу А с 2 по первую пустую ячейку, чтобы у цикла был конец.

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

таймером, который показывает время выполнения всего макроса после завершения

Привязываем подпрограмму к кнопкам для удобства и выполним скрипт. Получается:

Таким образом, скрипт проходит по столбцу I, забирая из значения каждой ячейки URL, для тех строк, где в столбце А есть значения (которые и подставляются в URL). Для удобства также сделаны кнопки очистки полей и подсветка запросов условным форматированием, в случае успешного ответа на запрос.

PUT

Чуть-чуть усложним задачу и перейдем к PUT-запросам. В данном примере необходимо изменить профиль устройства, чтобы сервер по-другому с ним взаимодействовал.

К исходным данным для GET – запроса добавляется тело запроса с ключем-значением (п4). Итого дано:

1) Ссылка, в которой указываются параметры запроса.

2) Заголовки запроса + Токен авторизации (Bearer Token)

—header ‘Content-Type: application/json’ —header ‘Accept: application/json’ —header ‘Authorization: Bearer

3) Параметр, указываемый в ссылке (в данном примере это внутренние идентификаторы устройств – hRef):

4) Тело запроса, с ключом и значением:

Немного дополняем новый PUT-лист в Excel по сравнению с GET (остальное без изменений):

новый столбец B теперь отвечает за ключ deviceProfileId (ячейка B1), а все значения ниже за его возможные значения)

Немного поменяем макрос и вынесем его в отдельную подпрограмму:

Привяжем макрос к кнопке и выполним.

Логика абсолютно аналогична GET запросу.

POST

Для POST запросов все аналогично PUT. Только немного меняется код в части типа запроса. В данном примере на устройство отправляется команда-конфигурация с указанием тела посылки (payload_hex) и порта (fport) для конкретного устройства.

Получившаяся таблица выглядит следующим образом:

На этом часть для Windows заканчивается. Здесь все оказалось довольно просто: стандартная библиотека, простенький алгоритм перебора значений в цикле.

Часть 2. Реализация решения под MacOS и Excel 64-bit

Чтобы обойти данное ограничение, был выбран единственный рабочий подход через cUrl, exec и функции. Данное решение точно работает под версией MacOS 10.14 и Excel 16.51. Функция ниже, в том или ином виде, встречается на различных форумах, однако на текущих версиях софта – не работает. В итоге, после небольших правок получили рабочий вариант:

Была отлажена функция вызова ExecShell:

И написаны отдельные функции для работы с различным методами GET / PUT / POST, которые на входе принимают URL и параметры):

В итоге, у меня получилось аналогичное windows по работе и функционалу решение для MacOS c использованием Excel 64-bit.

На просторах интернета я не нашел какого-то сборного и единого описания, только фрагменты кода и подходов, которые в большинстве случаев не работали полностью или частично. Поэтому решил объединить все в рабочее решение и выложить на хабр для истории.

На текущий момент я все еще не встретил иного решения, которое бы позволяло в пару кликов копипастить тысячи идентификаторов и параметров из excel и массово их отправлять на сервер. Надеюсь, кому-то пригодится :)

Если такие сторонние решения есть, а я не в курсе, и все можно было сделать проще, быстрее и изящнее – делитесь опытом в комментариях.

Файл-пример, который можно потыкать, пока жив сервер и «бессрочный» токен:

Читайте также:

      

  • Программа для прошивки sim800l
  •   

  • Работа с текстом в ms word может осуществляться в следующих режимах
  •   

  • Программа цветомузыка для андроид
  •   

  • Где взять 1с бухгалтерия бесплатно
  •   

  • Включение uefi в биос gigabyte ga z68ap d3

Понравилась статья? Поделить с друзьями:
  • Api в таблице excel
  • Api биржи для excel
  • Api javascript для word
  • Api javascript для excel
  • Api java for excel