• Как в гугл-таблице получить курс токена на текущий момент?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    coinmarketcap можно на одних формулах сделать. Хотя если есть API то быстрее/надёжнее/красивее использовать его.
    =IMPORTXML("https://coinmarketcap.com/ru/currencies/bitcoin/";"//div[contains(@class,'priceValue')]")
    Ответ написан
    4 комментария
  • Как в гугл-таблице получить курс токена на текущий момент?

    idShura
    @idShura
    1. Разбираетесь с API
    https://www.coingecko.com/ru/api/documentation

    Пример:

    Получаете список coins и находите id нужных криптовалют
    https://api.coingecko.com/api/v3/coins/list
    [
        {
            "id": "01coin",
            "name": "01coin",
            "symbol": "zoc"
        },
        {
            "id": "bitcoin",
            "name": "Bitcoin",
            "symbol": "btc"
        }
    ]


    Пример получения курса Bitcoin в rub и usd
    https://api.coingecko.com/api/v3/simple/price?ids=bitcoin&vs_currencies=rub%2Cusd


    2. Устанавливаете ImportJSON в google sheets
    ImportJSON

    3. Ипортируете данные
    =ImportJSON("https://api.coingecko.com/api/v3/simple/price?ids=bitcoin&vs_currencies=rub%2Cusd"; "/bitcoin/usd";)


    61b97696dea36789907526.png

    Пример Google sheets
    Ответ написан
    Комментировать
  • Как сгенерировать случайное слово из диапазона в ячейке рядом?

    ProgrammerForever
    @ProgrammerForever
    Учитель, автоэлектрик, программист, музыкант
    В С2:
    =ЕСЛИ(ИЛИ(C1="";ISFORMULA(C1));"";ИНДЕКС($B$1:$B$19;1+ЦЕЛОЕ(СЛЧИС()*СЧЁТЗ($B$1:$B$19))))

    ...и распространить вниз
    Ответ написан
    Комментировать
  • Есть ли смысл изучать мобильную разработку в ближайщие 10 лет?

    @evgeniy_lm
    Прочитайте рассказ А. Азимова "Профессия" там ответ на ваш вопрос
    Ответ написан
    1 комментарий
  • Как выполнить такое условие?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    Вам нужен VLOOKUP, например,

    =INDEX(IFERROR(VLOOKUP(A1:A8;D1:E4;2;0)))

    61a3437e2ecbe486375764.png

    Пример в Таблице https://docs.google.com/spreadsheets/d/1xGKClhD7M6...
    Ответ написан
    1 комментарий
  • Почему не работает переход из excel по гиперссылкам? Как исправить?

    @A1f
    Такое случается, если файл предоставлен в общий доступ нескольким пользователям. При отключении доступа ссылки начинают работать.
    Причину надо узнавать в Microsoft.
    Ответ написан
    Комментировать
  • Как суммировать определенные ячейки, закрашенные цветом?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    Можно как-нибудь так. Чтобы указывать нормальные диапазоны, можно парсить аргументы функции, но так надёжнее. С полученными данными можно делать что угодно. Если нужна сумма - оберните в СУММ()
    function filterByColor(dataRangeName, colorRangeName) {
      let ss = SpreadsheetApp.getActiveSpreadsheet();
    
      let colorRange = ss.getRangeByName(colorRangeName);
      let color = colorRange.getBackground();
    
      let dataRange = ss.getRangeByName(dataRangeName);
      let data = dataRange.getValues();
      let colors = dataRange.getBackgrounds();
    
      return data.map((row,ri)=>row.map((val,ci)=>color===colors[ri][ci]?val:""));
    }

    Демонстрационная таблица
    Ответ написан
    Комментировать
  • Почему Query в Google Spreadsheets возвращает строку не соответствующую запросу?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    На самом деле формула возвращает все верно - заголовок пустого результата своей работы.

    Чтобы обрезать этот заголовок, нужно использовать третий аргумент QUERY(;;0)

    Обратите внимание, что если QUERY вернет больше одного ответа, то будет ошибка. Выбор этой формулы в этих обстоятельствах неудачный.

    Но все же, нужно привести дату C2 к нужному формату =date '"&TEXT(C2;"yyyy-MM-dd")&"'

    =IFNA(
      QUERY(
        'Sales Data'!A:Q;
        "Select P where (F=0 and A="&A2&" and O=date '"&TEXT(C2;"yyyy-MM-dd")&"')";
        0
      );
    )


    619efef8f1487750037542.png
    Ответ написан
    1 комментарий
  • Как скопировать конкретное слово/значение из текста одной ячейки и вставить в конкретное место текста другой ячейки?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    Полагаю, что вы очень сильно поспешили с вопросом.

    Хороший вопрос - половина решения.

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

    Регулярное выражение
    .*?shipid:([^\/]+).*?mmsi:([^\/]+).*?imo:([^\/]+).*?vessel:([^\/]+).*?


    Строка-подстановка
    www.myshiptracking.com/vessels/$4-mmsi-$2-imo-$3

    Из исходной строки
    www.marinetraffic.com/ru/ais/details/ships/shipid:4643053/mmsi:477636800/imo:9751327/vessel:NING_JING_HAI/


    должно получиться
    www.myshiptracking.com/vessels/NING-JING-HAI-mmsi-477636800-imo-9751327


    Можно использовать формулу
    =REGEXREPLACE(B9,B3,D3)

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

    619daf24d4434991008817.png

    А вот и пример с Таблицей https://docs.google.com/spreadsheets/d/1WHKGbcyRc1...
    Ответ написан
    Комментировать
  • Как сделать флажок, который зачеркивает?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    Вам нужно добавить условное форматирование

    6197bb8f5ace7385624375.png

    Пример в Таблице https://docs.google.com/spreadsheets/d/1-BK1VAbPjm...
    Ответ написан
    1 комментарий
  • Болят глаза после покупки нового ноутбука, связано ли с IPS матрицей?

    glaphire
    @glaphire
    PHP developer
    У меня такое было с другим ноутбуком (Lenovo Thinkpad), попробуйте очки с антибликовым напылением и дополнительно поставить программу "фильтр синего излучения" (для Ubuntu есть RedShift, для других систем наскольно знаю тоже)
    Ответ написан
    4 комментария
  • Болят глаза после покупки нового ноутбука, связано ли с IPS матрицей?

    Снижать яркость ещё! У старой матрицы, скорее всего, деградировала подсветка, и яркость стала раза в 2 меньше от изначальной (а ещё, возможно, желтее). У новых яркость бешеная, и даже на 40% - это слишком много. Кроме того, зависит от того, в какой обстановке смотреть на экран - если ночью, и нет фоновой подсветки в комнате - глаза быстро устанут. И цветовой баланс в сторону жёлтого сместить немного, станет комфортнее.
    Ответ написан
    2 комментария
  • Как проверить ссылку RSS?

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

    с высокой вероятностью в ссылке будет слово rss (либо type=rss, так многие cms-ки экспортируют свои статьи туда либо .rss) но само собой никто ничего не гарантирует, никаких стандартов на это нет

    как правильно - запрашиваешь по ссылке заголовки, без контента, и смотришь Content-Type должен быть тип text/rss+xml или application/rss+xml, редко бывает text/xml или application/xml но тут дальше только по содержимому
    Ответ написан
    Комментировать
  • Как заменить число 1 на порядок цифр 1 до 366?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Регулярки для этого не предназначены в текстовых редакторах.
    Но если сам текст - это код (например, js), то вместо единиц можно вставить:
    x++
    А в самом начале скрипта
    var x = 1;

    Ещё вариант - написать свой собственный отдельный временный скрипт на любом простецком языке, который сделает всю работу над текстом. На том же js или какой язык вы хорошо знаете.

    UPD: Вот, пример скрипта на Lua, который делает замену:
    spoiler
    s = [[
    {
      "predict_UNIQUAL_number": 1,
      "text": "Удача придет откуда не ждете."
    },
    {
      "predict_UNIQUAL_number": 1,
      "text": "Давние долги будут возвращены вам."
    },
    {
      "predict_UNIQUAL_number": 1,
      "text": "Вас ожидает неожиданное денежное поступление."
    },
    {
      "predict_UNIQUAL_number": 1,
      "text": "Все неоконченные дела будут завершены."
    },
    ]]
    
    local x,n = 0,1
    repeat
        x = s:find('1', x+10, true)
        if x == nil then
            break
        end
        s = s:sub(1,x-1) .. n .. s:sub(x+1,#s)
        n = n + 1
    until false
    print(s)

    Вам нужно открыть любую песочницу, например эту, вставить скрипт, и нажать Run. Далее скрипт сделает всю работу. Сам скрипт написан за несколько минут на коленке.
    Ответ написан
    8 комментариев
  • Множественный ВПР в одной ячейке по части текста?

    ProgrammerForever
    @ProgrammerForever Куратор тега Excel
    Учитель, автоэлектрик, программист, музыкант
    В Excel на VBA что-то возможно подобное сделать.
    В Google таблицах есть шанс обойтись формулами, хотя и пользовательскую функцию там проще сделать.
    на формулах это жутко выглядит, да и ошибиться можно на раз. Формула для 3х итераций

    =join(
            "/"
            ;ТРАНСП(unique(
                    ТРАНСП(split(
                            join(
                                    "/"
                                    ;ArrayFormula(
                                            ЕСЛИОШИБКА(
                                                    ВПР(
                                                            split(
                                                                    join(
                                                                            "/"
                                                                            ;ArrayFormula(
                                                                                    ЕСЛИОШИБКА(
                                                                                            ВПР(
                                                                                                    split(
                                                                                                            ВПР(A1;FILTER(A:B;A:A<>"");2;0)
                                                                                                            ;"/"
                                                                                                    )
                                                                                                    ;FILTER(A:B;A:A<>"")
                                                                                                    ;2
                                                                                                    ;0
                                                                                            )
                                                                                            ;split(
                                                                                                    ВПР(A1;FILTER(A:B;A:A<>"");2;0)
                                                                                                    ;"/"
                                                                                            )
                                                                                    )
                                                                            )
                                                                    )
                                                                    ;"/"
                                                            )
                                                            ;FILTER(A:B;A:A<>"")
                                                            ;2
                                                            ;0
                                                    )
                                                    ;split(
                                                                    join(
                                                                            "/"
                                                                            ;ArrayFormula(
                                                                                    ЕСЛИОШИБКА(
                                                                                            ВПР(
                                                                                                    split(
                                                                                                            ВПР(A1;FILTER(A:B;A:A<>"");2;0)
                                                                                                            ;"/"
                                                                                                    )
                                                                                                    ;FILTER(A:B;A:A<>"")
                                                                                                    ;2
                                                                                                    ;0
                                                                                            )
                                                                                            ;split(
                                                                                                    ВПР(A1;FILTER(A:B;A:A<>"");2;0)
                                                                                                    ;"/"
                                                                                            )
                                                                                    )
                                                                            )
                                                                    )
                                                                    ;"/"
                                                            )
                                            )
                                    )
                            )
                            ;"/"
                    ))
            ))
    )


    Демонстрационная таблица
    Ответ написан
    5 комментариев
  • Почему скрипт не выбирает письма по заданному ярлыку(, но убирает ярлык с писем правильно)?

    А если попробовать искать письма так:
    var EMAIL_LABEL = '__renew';
    var query = 'in:inbox label:' + EMAIL_LABEL;
    var threads = GmailApp.search(query);
    var messages = GmailApp.getMessagesForThreads(threads);
    for (var i = 0; i < messages.length; i++) {
      for (var j = 0; j < messages[i].length; j++) {
        Logger.log(messages[i][j].getDate() + ' ' + messages[i][j].getSubject());
      }
    }
    Ответ написан
    Комментировать
  • Расширение таблицы при парсинге?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    В общем, рассказываю про парсинг.

    Код, который видно на странице через инспектор элементов в браузере - это код, который браузер подготовил для пользователя. Открываете сайт - браузер отправлять запрос на сервер. Запрос состоит из метода, пути, заголовков и тела. После первоначального запроса браузер получает от сервера HTML страницу, в которую включено (обычно) множество JS скриптов, которые в процессе выполнения могут создавать дополнительные запросы на сервер для получения дополнительной информации. После выполнения всех действий, пользователь видит в браузере готовый результат, который отличается от первоначального запроса из-за дополнительных джаваскриптов.

    Если элемент (класс, id, и тд) видно в инспекторе браузера - это не означает, что элемент присутствовал при первоначальном запросе. Чтобы увидеть тот код, который браузер получает первоначально (тот самый код, который вы получите через requests, curl итд) - нужно нажать CTRL+U, либо правой кнопкой -> просмотр кода страницы
    Это - тот самый код, который вы получаете, и все данные нужно искать только в нем, это дает гарантию того, что нужный вам элемент будет присутствовать при выполнении запросов через ЯП.

    Если нужного элемента нет на странице, значит он загружен каким нибудь JS скриптом. Здесь будут два варианта:
    1. JS отправляет дополнительный запрос на сервер, получает нужные данные и вставляет их в HTML.
    2. Данные создаются внутри JS скрипта без запросов (очень маловероятно)

    Если данные появляются в результате дополнительного запроса, то нужно просто повторить этот запрос.

    Чтобы понять, что нужно - нужно воспользоваться любым сниффером трафика. Самое простое - встроенный в браузер логгер запросов. F12 -> Network.
    6124fec4cfd69347854863.png
    Обычно достаточно поставить фильтр на XHR.
    Если есть под рукой Fiddler, то тоже сгодится. Ну и Burp / ZAP как вариант (но очень жирно).

    Алгоритм будет примерно таким:
    1. Открываем вкладку Network
    2. Очищаем историю запросов (если есть)
    3. Желательно поставить галочку "Preserve log", чтобы история не пропадала.
    4. Обновляем страницу. Если контент подгружается при прокретке / по нажатию кнопки - крутим / нажимаем и тд.
    5. Теперь можно нажать CTRL+F все в той же вкладке Network и вписать искомый текст (допустим название товара).
    6. Слева будут те запросы, которые содержат эту подстроку. Теперь нужно просто пощелкать по ним, найти нужный, посмотреть из чего он состоит и повторить его через requests.

    Нужно обратить внимание на заголовки и тело запроса. Не редко при загрузке доп. информации в тело запроса так же передается указатель текущей страницы, или индекс элемента, с которого начинается новый список. Так же в заголовки могут добавиться дополнительные. Например, csrf token, либо X-Requested-With. Если повторение запроса не принесло желанный результат - стоит проверить заголовки и тело еще раз. Если сайт загружает данные при нажатии на кнопки, прокрутке страницы и тд - алгоритм тот же.

    Делюсь хорошим сайтом, который увидел тут: https://curl.trillworks.com/
    Копируете свой запрос как CURL
    612500b91076a776091384.png
    Затем вставляете на сайт. Он выдаст готовый код на Python. Но нужно понимать, что это автоматический процесс и он не всегда выдает правильный результат. В частности, преобразование application/json тела довольно неправильно. Но для копипаста некоторых заголовков подходит вполне. В общем сайтом пользоваться можно, но и самому думать тоже нужно

    Из хороших программ - Postman. Позволит легко и быстро составлять запросы, есть экспорт в Python код. Советую, если запросы довольно тяжелые, чтобы составлять их "наживую".

    Краткая выжимка:
    1. Код через инспектор браузера != коду с запроса requests / curl.
    2. Скорее всего нужные вам данные подгружаются доп. запросами, ищутся через любой мониторинг трафика.
    3. Следите за телом и заголовками запроса. Заголовки, даже самые незначительные, могут влиять на конечный результат.
    4. Старайтесь всегда в заголовки добавлять User-Agent

    Если данные грузятся без доп запросов, лежат в неизвестном формате, или просто лень разбираться - используйте Selenium. Он является таким же браузером, но только с возможностью контролировать его работу
    Ответ написан
    3 комментария
  • Изучение языков программирования - дело второстепенное?

    @AndromedaStar
    .Net - monkey
    Если вы получаете образование, ради академического интереса, например вам интересна теория компиляторов, то изучение языков второстепенно.
    Если вы хотите зарабатывать деньги, то платить вам будут за практические умения. Тут без языков программирования не обойдешься.
    Ответ написан
    Комментировать