-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathraw_metrika_methods
468 lines (448 loc) · 34.2 KB
/
raw_metrika_methods
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
/*
ИНСТРУКЦИЯ https://github.com/meta110/powerbi/blob/master/README.md
1. Пройдите по ссылке https://raw.githubusercontent.com/meta110/powerbi/master/raw_metrika_methods и скопируйте в буфер обмена свежую версию этой функции
2. Создайте пустой запрос с именем RAW_METRIKA_API и вставьте в него указанный код
3. Для получения токена пройдите по ссылке https://oauth.yandex.ru/authorize?response_type=token&client_id=764f4af41256427ba87965a7ed31ea3d
4. Читайте комментарии в коде, чтобы изменить значения по умолчанию
ВНИМАНИЕ! функция может получать ответ достаточно долго (несколько минут) - это нормально для сырых данных. Уменьшите период времени или кол-во запрашиваемых полей
*/
///* //закомментируйте этот блок для отладки
let
RAW_METRIKA_API = (optional method as text, optional request_id1 as number, optional dateFrom1 as date, optional dateTo1 as date, optional counter as number, optional token as text, optional report1 as text, optional fields1 as any) =>
//*/
let
/*
//данные для отладки - если всё устраивает, этот блок можно удалить
counter = "186104",
token = "AQAAAAADYH8cAAFg-YJp23D5ZU_fpuYkxmegPks",
dateFrom = Date.ToText(#date(2013,10,1),"yyyy-MM-dd"),
dateTo = Date.ToText(#date(2013,10,1),"yyyy-MM-dd"),
report1 = null,
fields1 = null,
method = "auto",
*/
///* //закомментируйте этот блок для отладки
counter = if counter = null then "186104" else Text.From(counter), //номер счетчика можно указать здесь
token = if token = null then "AQAAAAADYH8cAAFg-YJp23D5ZU_fpuYkxmegPks" else token, //токен можно указать здесь
dateFrom = if dateFrom1 = null then Date.ToText(#date(2013,10,1),"yyyy-MM-dd") else Date.ToText(dateFrom1,"yyyy-MM-dd"),
dateTo = if dateTo1 = null then Date.ToText(#date(2013,10,1),"yyyy-MM-dd") else Date.ToText(dateTo1,"yyyy-MM-dd"),
request_id = if request_id1 = null and List.PositionOf({"info","clean","cancel","download"},method) >= 0 then error "Методы ""info"",""clean"",""cancel"",""download"" требуют обязательный идентификатор запроса" else request_id1,
method = if method = null then "list" else method,//
//*/
//Чтобы изменить список полей, запрашиваемых по умолчанию, закомментируйте ненужные поля и снимите комментарии с нужных полей
fields_visits = {
//"ym:s:counterID", //Номер счетчика
"ym:s:watchIDs", //Просмотры, которые были в данном визите. Ограничение массива — 500 просмотров
//"ym:s:date", //Дата визита
"ym:s:dateTime", //Дата и время визита
//"ym:s:dateTimeUTC", //Unix timestamp времени первого хита
"ym:s:isNewUser", //Первый визит посетителя
"ym:s:startURL", //Страница входа
"ym:s:endURL", //Страница выхода
"ym:s:pageViews", //Глубина просмотра (детально)
"ym:s:visitDuration", //Время на сайте (детально)
"ym:s:bounce", //Отказность
//"ym:s:ipAddress", //IP адрес
"ym:s:regionCountry", //Страна (ISO)
"ym:s:regionCity", //Город (английское название)
//"ym:s:regionCountryID", //ID страны
//"ym:s:regionCityID", //ID города
//"ym:s:params", //Параметры визита. Одинарные кавычки дополнительно экранируются как \\u0027
"ym:s:clientID", //Идентификатор пользователя на сайте
"ym:s:networkType", //Тип соединения
"ym:s:goalsID", //Идентификатор целей, достигнутых за данный визит
"ym:s:goalsDateTime", //Время достижения каждой цели
//"ym:s:goalsPrice", //Ценность цели
//"ym:s:goalsOrder", //Идентификатор заказов
//"ym:s:goalsCurrency", //Идентификатор валюты
"ym:s:lastTrafficSource", //Источник трафика
"ym:s:lastAdvEngine", //Рекламная система
"ym:s:lastReferalSource", //Переход с сайтов
//"ym:s:lastSearchEngineRoot", //Поисковая система
"ym:s:lastSearchEngine", //Поисковая система (детально)
"ym:s:lastSocialNetwork", //Cоциальная сеть
"ym:s:lastSocialNetworkProfile", //Группа социальной сети
"ym:s:referer", //Реферер
"ym:s:lastDirectClickOrder", //Кампания Яндекс.Директа
"ym:s:lastDirectBannerGroup", //Группа объявлений
"ym:s:lastDirectClickBanner", //Объявление Яндекс.Директа
"ym:s:lastDirectClickOrderName", //Название кампании Яндекс.Директа
"ym:s:lastClickBannerGroupName", //Название группы объявлений
"ym:s:lastDirectClickBannerName", //Название объявления Яндекс.Директа
"ym:s:lastDirectPhraseOrCond", //Условие показа объявления
"ym:s:lastDirectPlatformType", //Тип площадки
"ym:s:lastDirectPlatform", //Площадка
"ym:s:lastDirectConditionType", //Тип условия показа объявления
//"ym:s:lastCurrencyID", //Валюта
"ym:s:from", //Метка from
"ym:s:UTMCampaign", //UTM Campaign
"ym:s:UTMContent", //UTM Content
"ym:s:UTMMedium", //UTM Medium
"ym:s:UTMSource", //UTM Source
"ym:s:UTMTerm", //UTM Term
//"ym:s:openstatAd", //Openstat Ad
//"ym:s:openstatCampaign", //Openstat Campaign
//"ym:s:openstatService", //Openstat Service
//"ym:s:openstatSource", //Openstat Source
//"ym:s:hasGCLID", //Наличие метки GCLID
//"ym:s:lastGCLID", //GCLID последнего визита
//"ym:s:firstGCLID", //GCLID первого визита
//"ym:s:lastSignificantGCLID", //GCLID последнего значимого визита
//"ym:s:browserLanguage", //Язык браузера
//"ym:s:browserCountry", //Страна браузера
//"ym:s:clientTimeZone", //Часовой пояс на компьютере посетителя
"ym:s:deviceCategory", //Тип устройства. Возможные значения: 1 — десктоп, 2 — мобильные телефоны, 3 — планшеты, 4 — TV
"ym:s:mobilePhone", //Производитель устройства
"ym:s:mobilePhoneModel", //Модель устройства
"ym:s:operatingSystemRoot", //Группа операционных систем
//"ym:s:operatingSystem", //Операционная система (детально)
"ym:s:browser", //Браузер
//"ym:s:browserMajorVersion", //Major-версия браузера
//"ym:s:browserMinorVersion", //Minor-версия браузера
//"ym:s:browserEngine", //Движок браузера
//"ym:s:browserEngineVersion1", //Major-версия движка браузера
//"ym:s:browserEngineVersion2", //Minor-версия движка браузера
//"ym:s:browserEngineVersion3", //Build-версия движка браузера
//"ym:s:browserEngineVersion4", //Revision-версия движка браузера
//"ym:s:cookieEnabled", //Наличие Cookie
//"ym:s:javascriptEnabled", //Наличие JavaScript
//"ym:s:flashMajor", //Старший номер версии Flash. Может принимать значение 0, если у посетителя не поддерживается Flash
//"ym:s:flashMinor", //Младший номер версии Flash
//"ym:s:screenFormat", //Соотношение сторон
//"ym:s:screenColors", //Глубина цвета
"ym:s:screenOrientation", //Ориентация экрана
"ym:s:screenWidth", //Логическая ширина
"ym:s:screenHeight", //Логическая высота
"ym:s:physicalScreenWidth", //Физическая ширина
"ym:s:physicalScreenHeight", //Физическая высота
"ym:s:windowClientWidth", //Ширина окна
"ym:s:windowClientHeight", //Высота окна
//"ym:s:purchaseID", //Идентификатор покупки
//"ym:s:purchaseDateTime", //Дата и время покупки
//"ym:s:purchaseAffiliation", //Магазин или филиал, в котором произошла транзакция
//"ym:s:purchaseRevenue", //Полученный доход
//"ym:s:purchaseTax", //Сумма всех налогов, связанных с транзакцией
//"ym:s:purchaseShipping", //Стоимость доставки, связанная с транзакцией
//"ym:s:purchaseCoupon", //Промокод, ассоциированный со всей покупкой целиком
//"ym:s:purchaseCurrency", //Валюта
//"ym:s:purchaseProductQuantity", //Количество товаров в покупке
//"ym:s:productsPurchaseID", //Идентификатор покупки
//"ym:s:productsID", //Идентификатор товара
//"ym:s:productsName", //Название товара
//"ym:s:productsBrand", //Производитель товара
//"ym:s:productsCategory", //Категория, к которой относится товар
//"ym:s:productsCategory1", //Категория, к которой относится товар, уровень 1
//"ym:s:productsCategory2", //Категория, к которой относится товар, уровень 2
//"ym:s:productsCategory3", //Категория, к которой относится товар, уровень 3
//"ym:s:productsCategory4", //Категория, к которой относится товар, уровень 4
//"ym:s:productsCategory5", //Категория, к которой относится товар, уровень 5
//"ym:s:productsVariant", //Разновидность товара
//"ym:s:productsPosition", //Положение товара в списке
//"ym:s:productsPrice", //Цена товара
//"ym:s:productsCurrency", //Валюта товара
//"ym:s:productsCoupon", //Промокод ассоциированный с товаром
//"ym:s:productsQuantity", //Количество товара
//"ym:s:impressionsURL", //URL страницы с товаром
//"ym:s:impressionsDateTime", //Дата и время просмотра
//"ym:s:impressionsProductID", //Идентификатор просмотренного товара
//"ym:s:impressionsProductName", //Название просмотренного товара
//"ym:s:impressionsProductBrand", //Производитель просмотренного товара
//"ym:s:impressionsProductCategory", //Категория, к которой относится просмотренный товар
//"ym:s:impressionsProductCategory1", //Категория, к которой относится просмотренный товар, уровень 1
//"ym:s:impressionsProductCategory2", //Категория, к которой относится просмотренный товар, уровень 2
//"ym:s:impressionsProductCategory3", //Категория, к которой относится просмотренный товар, уровень 3
//"ym:s:impressionsProductCategory4", //Категория, к которой относится просмотренный товар, уровень 4
//"ym:s:impressionsProductCategory5", //Категория, к которой относится просмотренный товар, уровень 5
//"ym:s:impressionsProductVariant", //Разновидность просмотренного товара
//"ym:s:impressionsProductPrice", //Цена просмотренного товара
//"ym:s:impressionsProductCurrency", //Валюта для товара
//"ym:s:impressionsProductCoupon", //Промокод ассоциированный с просмотренным товаром
//"ym:s:offlineCallTalkDuration", //Длительность звонка в секундах
//"ym:s:offlineCallHoldDuration", //Длительность ожидания звонка в секундах
//"ym:s:offlineCallMissed", //Пропущен ли звонок
//"ym:s:offlineCallTag", //Произвольная метка
//"ym:s:offlineCallFirstTimeCaller", //Первичный ли звонок
//"ym:s:offlineCallURL", //URL, с которого был звонок (ассоциированная с событием страница)
//ВНИМАНИЕ! Перед закрывающей фигурной скобкой "}" не должно быть запятой ",", поэтому не комментируйте и не удаляйте следующую строчку, если не понимаете как это исправить!
"ym:s:visitID" //Идентификатор визита
//ВНИМАНИЕ! Чтобы ничего не сломать, не удаляйте и не комментируйте предыдущую строку!
},
//Чтобы изменить список полей, запрашиваемых по умолчанию, закомментируйте ненужные поля и снимите комментарии с нужных полей
fields_hits = {
//"ym:pv:counterID", //Номер счетчика
//"ym:pv:date", //Дата события
"ym:pv:dateTime", //Дата и время события
"ym:pv:title", //Заголовок страницы
"ym:pv:URL", //Адрес страницы
"ym:pv:referer", //Реферер
"ym:pv:UTMCampaign", //UTM Campaign
"ym:pv:UTMContent", //UTM Content
"ym:pv:UTMMedium", //UTM Medium
"ym:pv:UTMSource", //UTM Source
"ym:pv:UTMTerm", //UTM Term
//"ym:pv:browser", //Браузер
//"ym:pv:browserMajorVersion", //Major-версия браузера
//"ym:pv:browserMinorVersion", //Minor-версия браузера
//"ym:pv:browserCountry", //Страна браузера
//"ym:pv:browserEngine", //Движок браузера
//"ym:pv:browserEngineVersion1", //Major-версия движка браузера
//"ym:pv:browserEngineVersion2", // Minor-версия движка браузера
//"ym:pv:browserEngineVersion3", // Build-версия движка браузера
//"ym:pv:browserEngineVersion4", // Revision-версия движка браузера
//"ym:pv:browserLanguage", //Язык браузера
//"ym:pv:clientTimeZone", //Часовой пояс на компьютере посетителя
//"ym:pv:cookieEnabled", //Наличие Cookie
//"ym:pv:deviceCategory", //Тип устройства. Возможные значения: 1 — десктоп, 2 — мобильные телефоны, 3 — планшеты, 4 — TV
//"ym:pv:flashMajor", //Major-версия Flash. Может принимать значение 0, если у посетителя не поддерживается Flash
//"ym:pv:flashMinor", //Minor-версия Flash
//"ym:pv:from", //Метка from
//"ym:pv:hasGCLID", //Наличие GCLID
//"ym:pv:GCLID", //GCLID
//"ym:pv:ipAddress", //IP адрес
//"ym:pv:javascriptEnabled", //Наличие JavaScript
//"ym:pv:mobilePhone", //Производитель устройства
//"ym:pv:mobilePhoneModel", //Модель устройства
//"ym:pv:openstatAd", //Openstat Ad
//"ym:pv:openstatCampaign", //Openstat Campaign
//"ym:pv:openstatService", //Openstat Service
//"ym:pv:openstatSource", //Openstat Source
//"ym:pv:operatingSystem", //Операционная система (детально)
//"ym:pv:operatingSystemRoot", //Группа операционных систем
//"ym:pv:physicalScreenHeight", //Физическая высота
//"ym:pv:physicalScreenWidth", //Физическая ширина
//"ym:pv:regionCity", //Город (английское название)
//"ym:pv:regionCountry", //Страна (ISO)
//"ym:pv:regionCityID", //ID города
//"ym:pv:regionCountryID", //ID страны
//"ym:pv:screenColors", //Глубина цвета
//"ym:pv:screenFormat", //Соотношение сторон
//"ym:pv:screenHeight", //Логическая высота
//"ym:pv:screenOrientation", //Ориентация экрана
//"ym:pv:screenWidth", //Логическая ширина
//"ym:pv:windowClientHeight", //Высота окна
//"ym:pv:windowClientWidth", //Ширина окна
//"ym:pv:params", //Параметры. Одинарные кавычки дополнительно экранируются как \\u0027
"ym:pv:lastTrafficSource", //Источник трафика
//"ym:pv:lastSearchEngine", //Поисковая система (детально)
//"ym:pv:lastSearchEngineRoot", //Поисковая система
//"ym:pv:lastAdvEngine", //Рекламная система
//"ym:pv:artificial", //Искусственный хит, переданный с помощью функций hit(), event() и пр.
//"ym:pv:pageCharset", //Кодировка страницы сайта
"ym:pv:link", //Переход по ссылке
"ym:pv:download", //Загрузка файла
"ym:pv:notBounce", //Специальное событие «неотказ» (для точного показателя отказов)
"ym:pv:lastSocialNetwork", //Социальная сеть
"ym:pv:httpError", //Код ошибки
//"ym:pv:clientID", //Идентификатор пользователя на сайте
//"ym:pv:networkType", //Тип соединения
//"ym:pv:lastSocialNetworkProfile", //Страница социальной сети, с которой был переход
"ym:pv:goalsID", //Идентификаторы достигнутых целей
//"ym:pv:shareService", //Кнопка «Поделиться», имя сервиса
//"ym:pv:shareURL", //Кнопка «Поделиться», URL
//"ym:pv:shareTitle", //Кнопка «Поделиться», заголовок страницы
//"ym:pv:iFrame", //Просмотр из iframe
//ВНИМАНИЕ! Перед закрывающей фигурной скобкой "}" не должно быть запятой ",", поэтому не комментируйте и не удаляйте следующую строчку, если не понимаете как это исправить!
"ym:pv:watchID" //Идентификатор просмотра
//ВНИМАНИЕ! Чтобы ничего не сломать, не удаляйте и не комментируйте предыдущую строку!
},
report = if report1 = null or report1 = "Визиты" then "visits" else "hits",
fields_raw = if fields1 <> null then fields1 else if report = "hits" then fields_hits else fields_visits,
fields_list = try List.Transform(Text.Split(fields_raw, ","), Text.Trim) otherwise fields_raw,
header_metrika_auth = [
#"Authorization" = "OAuth " & token,
#"Content-Type" = "application/x-yametrika+json",
#"Accept-Encoding" = "gzip"
],
Query = [
date1 = dateFrom,
date2 = dateTo,
fields = Text.Combine(fields_list, "," ),
source = report
],
rec = (
Headers as record, //1 заголовки
optional relpath as text, //2 относительный путь
optional Query as record, //3 GET-параметры
optional status as list, //4 статусы ошибок, обрабатываемые вручную
optional post as logical, //5 отправить POST запрос
optional retry as logical //6 не использовать кешированный ответ
) =>
Record.RemoveFields(
[ // запись со всеми возможными полями
Headers = Headers,
RelativePath = relpath,
Query = Query,
Content = Json.FromValue("[]"),
IsRetry = retry,
ManualStatusHandling = status
],
List.RemoveNulls( // составляю список пустых или неверных полей
{if relpath = null or Text.Length(relpath) = 0 then "RelativePath" else null}
&{if Query = null or Record.FieldCount(Query) = 0 then "Query" else null}
&{if post = null then "Content" else null}
&{if retry = null then "IsRetry" else null}
&{if status = null or List.Count(status) = 0 then "ManualStatusHandling" else null}
)
),
wrap = (method as text, optional request_id as number, optional part as number) =>
let
Url = "https://api-metrika.yandex.net/management/v1/counter/" & counter,
LogRqtPath = (optional part as text) => Text.Combine({"logrequest",Text.From(request_id),part},"/"), //строит относительный путь
Options =
if method = "info" then // информация о запросе логов https://yandex.ru/dev/metrika/doc/api2/logs/queries/getlogrequest-docpage/
rec(header_metrika_auth,LogRqtPath(),null,{400},null,true)
else if method = "clean" then // очистка подготовленных логов https://yandex.ru/dev/metrika/doc/api2/logs/queries/clean-docpage/
rec(header_metrika_auth,LogRqtPath("clean"),null,{400},true,true)
else if method = "cancel" then // отмена необработанного запроса логов https://yandex.ru/dev/metrika/doc/api2/logs/queries/cancel-docpage/
rec(header_metrika_auth,LogRqtPath("cancel"),null,{400},true)
else if method = "load" then // загрузка части подготовленного лога https://yandex.ru/dev/metrika/doc/api2/logs/queries/download-docpage/
rec(header_metrika_auth ,LogRqtPath(Text.Combine({"part",Text.From(part),"download"},"/")),null,{400})
else if method = "make" then // создание запроса лога https://yandex.ru/dev/metrika/doc/api2/logs/queries/createlogrequest-docpage/
rec(header_metrika_auth,"logrequests",Query,{400},true,true)
else if method = "evaluate" then // возможность создания запроса лога https://yandex.ru/dev/metrika/doc/api2/logs/queries/evaluate-docpage/
rec(header_metrika_auth,"logrequests/evaluate",Query,{400})
else // список запросов логов https://yandex.ru/dev/metrika/doc/api2/logs/queries/getlogrequests-docpage/
rec(header_metrika_auth,"logrequests",null,null,null,true),
Source = Web.Contents(Url,Options),
json = Json.Document(Source),
result =
if List.PositionOf({"info","clean","cancel","make"},method) >= 0 then
json[log_request]
else if method = "load" then // несмотря на то, что по заголовкам тип данных - Json, возвращается TSV
Table.PromoteHeaders(Csv.Document(Source,null,"#(tab)"))
else if method = "evaluate" then
json[log_request_evaluation]
else if method = "list" then
Table.FromRecords(json[requests],null,MissingField.UseNull) // у запросов в статусе created нет size и parts, поэтому возникает ошибка если в списке одновременно есть запросы со статусом processed, у которых size и parts есть
else if method = "cleanall" then // полностью очищаю список запросов
let
all = @wrap("list"),
report = Table.AddColumn(all, "report", each if _[status] = "created" then @wrap("cancel",_[request_id]) else @wrap("clean",_[request_id]))
in // вместо таблицы надо запросить info
if Table.IsEmpty(all) then "Nothing to clean" else Table.FromRecords(report[report])
else if method = "create" then // добавляет запрос в очередь
let
requests = @wrap("list"),
similar = Table.SelectRows(requests, each List.Sort([fields]) = List.Sort(fields_list) and [date1] = dateFrom and [date2] = dateTo), // переставить по увеличению сложности
select_last = List.Max(similar[request_id])
in
if Table.IsEmpty(requests) or Table.IsEmpty(similar) then // список запросов пуст или аналогичный запрос среди готовых не найден
@wrap("make")[request_id]
else // есть аналогичный запрос, поэтому возвращаю ID последнего аналога
select_last
else if method = "w84" then // пауза до готовности. Готовность проверяю каждые 8 секунд. Яндекс дает в заголовке ответа примерное время, но с помощью PQ его не извлечь
let
init = @wrap("info",request_id),
w8 = List.Generate(
()=>[
state = init, // текущее состояние запроса
line = 1, // порядковый номер итерации
s = 0 // логический счетчик
],
each [s] < 2 and [line] < 150, // на всякий случай ограничиваю 150 циклами по 8 секунд - примерно 20 минут
each [
state = Function.InvokeAfter(
()=>@wrap("info",request_id),
#duration(0,0,0,8) // добавляю паузу в 8 секунд
),
s = if state[status] = "created" then [s] else [s] + 1, // если статус created, то счетчик не меняется
line = [line] + 1 // увеличиваю счетчик итераций
]
),
last = List.Last(w8)
in
if init[status] = "processed" then // если лог уже готов, то сразу возвращаю его ID
request_id
else // если лог не готов, выполняется код ожидания и потом возвращается ID запроса
last[state][request_id]
else if method = "download" then // загружаю все готовые части запроса
let
Source = @wrap("info",request_id),
parts = List.Transform(Source[parts], each @wrap("load",request_id,_[part_number]))
in
if Source[status] = "processed" then
Table.Combine(parts)
else
Source
else if method = "auto" then
let
possibility = @wrap("evaluate"),
ready = @wrap("create"),
steady = @wrap("w84", ready),
go = @wrap("download", steady)
in
if possibility[possible] = true then go else possibility
else
json
in
try json[errors]{0} otherwise result,
LR.list = wrap(method,request_id)
in
LR.list
///*
,yesterday = Date.AddDays(DateTime.Date(DateTime.LocalNow()),-1),
tok = "AQAAAAADYH8cAAFg-dv0iYDePUFbsFyLBO5drM8",
cou = 186104,
beg = #date(2009,08,03),
end = #date(2014,02,28),
fie = "ym:s:startURL, ym:s:pageViews, ym:s:visitDuration",
fnType = type function(
optional method as (type text
meta [
Documentation.FieldCaption = "Выберите метод:",
Documentation.FieldDescription = """auto"" - отправить запрос и получить данные; ""create"" - создать запрос или вернуть id такого же выполненного; ""list"" - показать список всех запросов в аккаунте; ""download"" - загрузить выполненный запрос; ""info"" - получить статус запроса; ""clean"" - удалить выполненный запрос; ""cancel"" - отменить выполнение запроса; ""cleanall"" - полностью очистить аккаунт",
Documentation.AllowedValues = {"auto","evaluate","create","list","info","download","clean","cancel","cleanall"}
]
),
optional request_id as (type number
meta [
Documentation.FieldCaption = "Идентификатор запроса:",
Documentation.FieldDescription = "Методы ""info"",""clean"",""cancel"",""download"" требуют указания идентификатора",
Documentation.SampleValues = {cou}
]
),
optional dateFrom as (type date
meta [
Documentation.FieldCaption = "Дата начала интервала:",
Documentation.FieldDescription = "Дата начала интервала не может быть позднее чем вчера: " & Text.From(yesterday),
Documentation.SampleValues = {beg}
]
),
optional dateTo as (type date
meta [
Documentation.FieldCaption = "Дата окончания интервала:",
Documentation.FieldDescription = "Дата окончания должна совпадать с датой начала интервала или быть раньше нее",
Documentation.SampleValues = {end}
]
),
optional counter as (type number
meta [
Documentation.FieldCaption = "Номер счетчика Яндекс.Метрики:",
Documentation.FieldDescription = "Ищите номер счетчика в Метрике нужного сайта или на странице https://metrika.yandex.ru/list",
Documentation.SampleValues = {cou}
]
),
optional token as (type text
meta [
Documentation.FieldCaption = "Ключ авторизации:",
Documentation.FieldDescription = "Для получения ключа авторизуйтесь в метрике и пройдите по ссылке https://clc.to/metrika-auth",
Documentation.SampleValues = {tok}
]
),
optional report1 as (type text
meta [
Documentation.FieldCaption = "Выберите тип отчета",
Documentation.FieldDescription = "Выбирайте ""Визиты"", если не уверены что выбрать",
Documentation.AllowedValues = {"Визиты","Просмотры"}
]
),
optional fields1 as (type any
meta [
Documentation.FieldCaption = "Список полей через запятую или List (списком):",
Documentation.FieldDescription = "Перечислите поля через запятую или передайте список полей. Список допустимых полей для отчета ""Визиты"" находится здесь: https://tech.yandex.ru/metrika/doc/api2/logs/fields/visits-docpage/, а для отчета ""Просмотры"" - здесь: https://tech.yandex.ru/metrika/doc/api2/logs/fields/hits-docpage/"
]
)
) as text
in
Value.ReplaceType(RAW_METRIKA_API, fnType)
//*/