Задать вопрос
  • Как проверить google script есть ли с таким же именем лист в таблице как и активный?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Вероятнее всего, вы хотите проверить, есть ли лист с заданным именем в книге. Просто возьмите этот лист - сразу станет понятно - он есть или его нет.

    Пример

    const sheetName = 'Sheet1';
    const sheet = book.getSheetByName(sheetName);
    if(sheet){
      cnsole.log(`Лист с именем ${sheetName} есть`);
    }


    Или, что чаще используется, создание листа, если его нет

    const sheetName = 'Sheet1';
    const sheet = book.getSheetByName(sheetName) || book.insertSheet(sheetName);
    Ответ написан
    Комментировать
  • Как в Битрикс24 собирать лиды из почты?

    promconsulting
    @promconsulting
    Настройка и обучение Битрикс24
    Если портал не "рабочий" то почта работает с опозданием.
    Как только начнете работать все приходит вовремя.
    Если вообще письма не приходят, то значит неверные настройки.
    Пришлите запрос с админ доступом на почту: promconsulting@yandex.ru
    Могу посмотреть, бесплатно
    Ответ написан
    Комментировать
  • Как найти в многомерном ассоциативном массиве значение и вывести массив данных по ключам php?

    @Allarion Автор вопроса
    Решение
    function findArray ($ar, $findValue, $executeKeys){
      $result = array();
    
      foreach ($ar as $k => $v) {
        if (is_array($ar[$k])) {
          $second_result = findArray ($ar[$k], $findValue, $executeKeys);
          $result = array_merge($result, $second_result);
          continue;
        }
        if ($v === $findValue) {
          foreach ($executeKeys as $val){
            $result[] = $ar[$val];
          }
          
        }
      }
      return $result;
    }
    Ответ написан
    Комментировать
  • Не запускается PhpStorm 2020.2.3 на Windows 10. Как исправить?

    @empirikk
    Не знаю куда именно отнести свой вариант, но кажется по названию эта ветка самая подходящая, поэтому напишу здесь, вдруг кому пригодится) Смотрите, переустанавливал несколько раз phpstorm от 2019.3.3 до 2021.2.3. Когда прообновлялся до 2021.2.3 перестали запускаться версии после 2020.n.n. Соответственно все 2019.n.n. и 2020.n.n. - работали, а 2021.n.n. - не работали. Гуглил гуглил, ничего не помогало из предложеных вариантов, как и переустановки с вычисткой реестра и перезагрузками, затем решил начать переименовывать все папки JetBrains из User\AppData и спустя две минуты и такой-то матери я нашёл эту(и) паку(и) которые создавали помеху при запуске. Оказалось всё что нужно было сделать, это удалить: "C:\Users\User\AppData\Roaming\JetBrains\PhpStorm2021.1"
    "C:\Users\User\AppData\Roaming\JetBrains\PhpStorm2021.2"
    Потом запустить PhpStorm и он создаст их(эти удалённые папки) заново и всё заработает. Надеюсь, это будет кому-то полезно. Потому что я ничего такого не нашёл при поиске
    Ответ написан
    9 комментариев
  • Как можно выводить изменения ячейки в гугл таблицах?

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

    Дополнение, которое я пишу, сможет это сделать, но оно еще готовится к публикации.
    Ответ написан
    2 комментария
  • Почему из Битрикс24 не приходит запрос после обновления товара?

    @herovoid Автор вопроса
    Нашёл ответ в техподдержке. Оказалось, это временный баг, и теперь в Битриксе создана заявка отделу разработок для устранения этой проблемы.

    "Обновленная карточка товара открывается через магазин, даже если заходить в нее из црм. Поскольку в реальности товар обновляется в магазине, событие CRMPRODUCT его не видит" - комментарий ТП.
    Ответ написан
    Комментировать
  • Illegal offset type in - как быть?

    Denormalization
    @Denormalization
    Ты пытаешься задать ключ массивом. Так нельзя.
    Ответ написан
    1 комментарий
  • Как протянуть скриптом формулу по столбцу "J:J", до последней заполненной ячейки ориентируясь на столбец "C:C"?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Вам нужно что-то типа такого

    /**
     * @file Dragg down a formula
     * @url https://qna.habr.com/q/709715
     * */
    
    /**
     * User action. Runs the snippet
     */
    function run() {
      const sheet = SpreadsheetApp.getActiveSheet();
      const base = sheet.getRange('C3:C');
      const colFormula = sheet.getRange('J3');
      draggDownFormulas_(base, colFormula);
    }
    
    /**
     * @param {GoogleAppsScript.Spreadsheet.Range} base
     * @param {GoogleAppsScript.Spreadsheet.Range} colFormula
     */
    function draggDownFormulas_(base, colFormula) {
      const baseValues = base.getValues();
      const lastBase =
        baseValues.length - baseValues.reverse().findIndex(row => row[0] !== '');
      const colFormulaFormula = colFormula.getFormula();
      colFormula
        .getSheet()
        .getRange(base.getRow(), colFormula.getColumn(), lastBase)
        .setFormula(colFormulaFormula);
    }


    5e3c613d3eabc476526073.png

    Обратите внимание
    • проверка начинается с 3й строки
    • колонка C заполнена на одну строку ниже, чем массив данных
    • копируется формула из J3
    • чтобы код работал, вам нужно включить V8


    Сниппет
    Ответ написан
    2 комментария
  • Как решить ошибку с Warning: count(): Parameter must be an array or an object that implements Countable in ....?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    Эту ошибку возвращает count когда в него передается null. До версии php 7.2 вернет 0, а с версии php 7.2 будет описанная ошибка.

    Исправить можно, вот так
    $products = $this->getProductList();
    if ($products) {


    а лучше так
    $products = $this->getProductList();
    if (is_iterable($products)) {


    а еще лучше вот так
    $products = $this->getProductList();
    if (is_countable($products)) {

    но для этого варианта нужен или php 7.3 или полифил который можно найти в комментариях к описанию функции https://www.php.net/manual/ru/function.is-countable.php
    Ответ написан
    1 комментарий
  • Как показать кириллицу в phpStorm?

    alleroy
    @alleroy Автор вопроса
    Изучаю фреймворк laravel
    Наконец та решил проблему, вместо русских букв знаки вопросов. Если кому надо будет, то нужно в phpStrom зайти в Settings → File Encoding → File/Derectory → Default Encouding выбираем UTF-8

    2d565248d5834981869721be39b128f7.png
    Ответ написан
    Комментировать
  • Есть ли в Bitrix24 REST API оператор OR для фильтров crm.deal.list?

    @noroots Автор вопроса
    Поскольку документация не особо помогает составить запрос, выложу тут решение.

    $params = [
    	'cmd' => [
            'kp_num' => 'crm.deal.list?' . http_build_query(
    			[
    				'filter'	=>  [
    					'UF_CRM_***' => '111',
    				],
    				'select'	=> [
    					'ID',
    					'COMPANY_ID',
    					'STAGE_ID',
    					'UF_CRM_***',
    					'DATE_MODIFY'
    				]
    			]
    		),
            'ord_num' => 'crm.deal.list?' . http_build_query(
    			[
    				'filter'	=>  [
    					'UF_CRM_***' => '222',
    				],
    				'select'	=> [
    					'ID',
    					'COMPANY_ID',
    					'STAGE_ID',
    					'UF_CRM_***,
    					'DATE_MODIFY'
    				]
    			]
    		),
    	]
    ];
    Ответ написан
    Комментировать
  • Как выкачать весь сайт?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    https://eternallybored.org/misc/wget/

    Чтобы скачать сайт целиком с помощью wget нужно выполнить команду:
    wget -r -k -l 7 -p -E -nc http://site.com/

    После выполнения данной команды в директорию site.com будет загружена локальная копия сайта site.com. Чтобы открыть главную страницу сайта нужно открыть файл index.html.
    Рассмотрим используемые параметры:
    -r — указывает на то, что нужно рекурсивно переходить по ссылкам на сайте, чтобы скачивать страницы.
    -k — используется для того, чтобы wget преобразовал все ссылки в скаченных файлах таким образом, чтобы по ним можно было переходить на локальном компьютере (в автономном режиме).
    -p — указывает на то, что нужно загрузить все файлы, которые требуются для отображения страниц (изображения, css и т.д.).
    -l — определяет максимальную глубину вложенности страниц, которые wget должен скачать (по умолчанию значение равно 5, в примере мы установили 7). В большинстве случаев сайты имеют страницы с большой степенью вложенности и wget может просто «закопаться», скачивая новые страницы. Чтобы этого не произошло можно использовать параметр -l.
    -E — добавлять к загруженным файлам расширение .html.
    -nc — при использовании данного параметра существующие файлы не будут перезаписаны. Это удобно, когда нужно продолжить загрузку сайта, прерванную в предыдущий раз.
    Ответ написан
    1 комментарий
  • С чего начать изучение дискретной математики?

    usdglander
    @usdglander
    Yipee-ki-yay
    В смысле? Берете любой учебник по дискретной математике и учите. Там темы в нужном порядке расположены.
    Ответ написан
    Комментировать
  • Что быстрее массив или объект?

    ivinnic
    @ivinnic
    Full-Stack - подустал
    Добрый день

    Написал два скрипта с замером времени поиска.

    Search by object
    let obj = {}
    
    for(let i =0; i<1000; i++){
        obj['i'+i]=i
    }
    
    console.time('time')
    for(let i =0; i<1000; i++){
    const objResult = obj['i'+i];
    }
    console.timeEnd('time')


    time: 0.156982421875ms

    Search by array
    let obj = []
    
    for(let i =0; i<1000; i++){
        obj.push('i'+i)
    }
    
    console.time('time')
    
    for(let i =0; i<1000; i++){
        const arrResult = obj.find(el => el === 'i'+i);
    }
    console.timeEnd('time')


    time: 32.946044921875ms

    Время конечно может отличатся, но в целом видится что поиск по массиву работаем медленнее обращения по ключу, по крайне мере в промышленном масштабе.
    Ответ написан
    1 комментарий
  • Как обучить глупых студентов функциональному программированию?

    raf_gal
    @raf_gal
    я думаю тут надо начать с голого лиспа
    и там познать дзен

    надо полностью отказаться от императивного мышления

    надо мысленно побывать в мире "лямбда окраинная" из сказки про языки программирования:
    О глубокой философии программирования (серьезный р...
    Ответ написан
    2 комментария
  • Как извлечь кубический корень в гугл таблицах?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    Как вариант, только комбинацией формул

    =SIGN(-9)*ABS(-9)^(1/3)
    Ответ написан
    Комментировать
  • Как не распыляться в обучении?

    Adamos
    @Adamos
    Эффект крысы, нашедшей рычажок, включающий электроды у нее в мозгу.
    Ты хватаешься за новую технологию, играешься с ней, получаешь удовольствие, в крови плещется дофамин.
    А берешься копать глубже - там уже рутина, неинтересно, уровень дофамина падает и мозг ищет, как его поднять. Да вот же - надо бросить все, схватиться еще за одну игрушку, и получишь новую дозу.
    Пока такое поведение не будет сопровождаться выбросом кортизола, потому что тебе реально надо заниматься делом, а ты балуешься - так и будешь "жать на рычажок".
    Можно начать с проверки, чему ты научился за эти 1,5 года. На каких-нибудь тестах, которые ткнут тебя носом в грязь и покажут, что ты полный неуч, похватал по верхам, но всерьез ничего не освоил.
    Ну, банально выйти из этой самой пресловутой зоны комфорта. Испортить себе это благодушное настроение, создать стресс. Он мотивирует.
    Ответ написан
    1 комментарий
  • Как понять, что введенное значение является датой?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Вопрос больше к JavaScript, а не к Google Apps Script.

    Проверяйте наличие чего-либо в переменной, а потом проверьте, имеет ли эта переменная метод getTime.

    function isDate(value){
      return value && value.getTime;
    }


    Академический способ, который раньше не работал в скриптах, потому что не хватало чего-то.

    function isDate(date){
      return date instanceof Date && !isNaN(date.valueOf());
    }


    Решение
    Пример с неопределенным результатом без вызова ошибки
    var birthday1 = ss1.getRange("D8").getValue();
    var birthday = isDate(birthday1) ?
      Utilities.formatDate(birthday1, "GMT+3", "dd-MM-yyyy") : 
      undefined;
    Ответ написан
    2 комментария
  • Как запустить onEdit из редактора или программным способом?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Насколько я понимаю, вы пробуете вызвать функцию onEdit из другой функции или из редактора.

    Разбор ошибки

    Ошибка
    TypeError: Cannot read property 'range' of undefined (строка 3, файл se)

    Означает, что в некотором файле se в 3й строке есть некоторая переменная со значением undefined, свойство range которой прочитать невозможно. Тут все очевидно - у undefined нет свойств.

    Если посмотреть на код, то становится ясно, что имя этой переменной e. И мы ее получаем в системную функцию onEdit. Это означает, что система сама передает контекст в эту функцию.

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

    Например,

    /**
     * Тестирование триггера для события EDIT
     */
    function runOnEdit() {
      var source = SpreadsheetApp.getActive();
      var range = source.getRangeByName('Sheet!!B26');
      /**
       * @type {GoogleAppsScript.Events.SheetsOnEdit}
       */
      var e = {
        authMode: ScriptApp.AuthMode.LIMITED,
        oldValue: undefined, // ну или что хотите
        range: range,
        value: range.getValue(),
        source: source,
        triggerUid: 0,
        user: Session.getActiveUser(),
      };
    
      onEdit(e);
    }
    
    /**
     *
     * @param {GoogleAppsScript.Events.SheetsOnEdit} e
     */
    function onEdit(e) {
      // Работает простой триггер
    }


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