Задать вопрос
  • Как в Google Sheet сделать фильтрацию по формуле?

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

    =FILTER(A1:A5;B1:B5<=2500)

    601a5f2926227276471539.png

    Подробнее про FILTER https://contributor.pw/post/google-sheets-formulas...
    Ответ написан
    Комментировать
  • Как формулой вернуть значение пустой ячейки?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    Мне больше всего нравится ссылка на пустой диапазон. Просто создайте именованный диапазон, в моем случае это BLANK, который ссылается на какую-то всегда пустую ячейку. Далее, например, в B1

    =IF(A1=1;BLANK;A1)

    Если в C1 добавить =ISBLANK(B1), то вернет TRUE

    601a2b7b23fc8863726221.png
    Ответ написан
    Комментировать
  • Как вставить картинку непосредственно в ячейку Таблицы?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Решение на данный момент

    function insertImageToCell() {
      const image = SpreadsheetApp
        .newCellImage()
        .setSourceUrl('https://upload.wikimedia.org/wikipedia/commons/5/50/Smile_Image.png')
        .build();
      SpreadsheetApp.getActiveRange()
        .setValue(image);
    }

    Предыдущий ответ

    Сам процесс вставки картинки довольно специфический и может потребовать определенных навыков. Поэтому я приведу уже готовый пример, основанный на публичном коде. Все это работает не очень быстро, поэтому вам необходимо задуматься о заранее подготовленных картинках и куда вы их будете вставлять. Порции функции такие: на один лист массив из картинок с координатами. Т.е. на один лист можно сразу добавить несколько картинок. Это будет самым оптимальным способом именно из-за специфики вставки.

    Функция вставки
    /**
     * Insert a single image to the cell. A1 is default
     *
     * @param {GoogleAppsScript.Spreadsheet.Sheet} sheet
     * @param {GoogleAppsScript.Base.Blob} blob
     * @param {number} row
     * @param {number} column
     */
    function insertImageBlobToCell_(sheet, blob, row = 1, column = 1) {
      const sheetName = sheet.getName();
      const parentId = sheet.getParent().getId();
      return DocsServiceApp.openBySpreadsheetId(parentId)
        .getSheetByName(sheetName)
        .insertImage([{ blob, range: { row, column } }]);
    }


    Пример вызова
    /**
     * Insert an image blob to the cell
     */
    function userActionRun() {
      const sheet = SpreadsheetApp.getActiveSheet();
      const blob = UrlFetchApp.fetch(
        'https://contributor.pw/img/post/sheets/sheets_mmult-some-uses-cases_01.png'
      ).getBlob();
      insertImageBlobToCell_(sheet, blob);
    }


    Результат
    601a1d24dca43655873570.png

    Не забудьте добавить библиотеку
    108j6x_ZX544wEhGkgddFYM6Ie09edDqXaFwnW3RVFQCLHw_mEueqUHTW
    в свой проект. Пример манифеста в сниппете
    Ответ написан
    4 комментария
  • Как добавить пробелы и скобки в формулу?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    К сожалению, интерпретатор регулярных выражений, на котором основана эта программа, не поддерживает вложенные вызовы. Поэтому необходимо самостоятельно распарсить строку и соединить ее как надо.

    ="Итого с учетом всего : " & TEXT(D8;"#,##0.00") & REGEXREPLACE(
      MONEYTEXT(D8;"RUB") & " ноль копеек ";
      "(.*)\s(руб[а-я]+)(.*?)(коп[а-я]+)(.*)";
      " ($1) $2 " & TEXT(ROUND(MOD(D8;1);2)*100;"00") & " $4"
    )


    6022a4496d118990363140.png

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


    Обновлено

    Подсказывают https://t.me/googleappsscriptrc/35292 чуть более гуманную для человеческих глаз формулу для получения числа копеек

    ="Итого с учетом всего : " & D8 & " " & REGEXREPLACE(
      MONEYTEXT(D8; "RUB");
      "(.*?)\s(руб[а-я]{0,})[\s].*?(коп[а-я]{0,})";
      "($1) $2 " & REGEXEXTRACT("" & D8;",(\d{2})") & " $3"
    )
    Ответ написан
  • Как реализовать автоматический перевод цифр в буквы?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    Попробуйте дополнение https://contributor.pw/post/add-on-numbertext/
    Ответ написан
    Комментировать
  • Есть ли JavaScript библиотека максимально похожая на Google Sheets?

    oshliaer
    @oshliaer
    Google Products Expert
    Возможно, лучшим предложением будет https://myliang.github.io/x-spreadsheet
    60163c8f90202752482539.png
    в то время, как контейнером таблицы я бы предпочел https://sheetjs.com за надежность. Если у вас нет необходимости в формулах, то возьмите второе.
    60163c63d87f3460037426.png
    Ответ написан
    2 комментария
  • Можно ли получить почту, с которой человек прошел опрос в Гугл Форме?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Эту возможность можно реализовать только с подпиской Google Workspace и то в пределах организации, т.е. группы доменов.

    Что в общем-то честно, т.к. пользователю нужно представиться системе. А представление системе несет с собой некоторую степень ответственности. Форма-то не ваша, а Гугла.
    Ответ написан
    1 комментарий
  • Как скрыть разделы при просмотре результатов гугл форм?

    oshliaer
    @oshliaer
    Google Products Expert
    К сожалению, насколько я знаю, ничего поделать нельзя.

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

    601563ea5c09c045521316.png

    Гугл точно читает эти отзывы. Другое дело - примет ли он меры?
    Ответ написан
    Комментировать
  • Как скриптом запретить перенос ячейки, но при этом разрешить копирование и очищение ячейки?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    Это неверное представление о Таблицах и Скриптах.

    Скрипты - серверное приложение для взаимодействия с данными Таблиц, а не для управления их интерфейсом.

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

    Только Гугл может это сделать. Поэтому ответом на ваш вопрос будет совет отправить предложение по улучшению непосредственно из меню Таблиц.

    Добавлено

    Ответ написан
    Комментировать
  • Почему QUERY выводит значение в одну строку?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    Вопрос решил @mityayka1 в комментарии Почему QUERY выводит значение в одну строку?

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

    =QUERY(range; sql_query; 1)

    важен вот этот 1
    Ответ написан
    Комментировать
  • Почему некорректно работает doGet, если логиниться под другим доменом?

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

    Обратитесь к администратору Google Workspace, с доменом которого возникли проблемы.
    Ответ написан
    5 комментариев
  • Как заполнить ячейку по словарю?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    Как сказали выше SEARCH или FIND могут решить эту задачу

    60104f8f7e541660391961.png

    =ARRAYFORMULA(TRIM(TRANSPOSE(QUERY(TRANSPOSE(IFERROR(
      IF(
        FIND(TRANSPOSE(LOWER('словарь'!B2:B11));LOWER(B2:B11));
        TRANSPOSE('словарь'!B2:B11)
      )
    ));;9^9))))


    Пример https://docs.google.com/spreadsheets/d/1YxaovrYFH8...
    Ответ написан
    Комментировать
  • Как из строки даты и строки времени получить формат Date?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Даты и время в Таблицах просто складываются. Самое выгодное в данной ситуации - иметь колонку с суммой между "dd.MM.yyyy" и "HH:mm:ss".

    Для получения валидного объекта Date буде достаточно из итоговой ячейки взять значение.

    const dateTimeStart = sheets.getRange('C1').getValue();

    Откуда у вас возьмется dateTimeEnd - только вам известно, но в итоге, полученный dateTimeStart подходит для передачи в качестве значений аргументов в методы CalendarApp.
    Ответ написан
    Комментировать
  • Как вытащить из базы данных прошедшие годы?

    oshliaer
    @oshliaer
    Google Products Expert
    Не понятно, причем тут Таблицы?

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

    [
      {
        vid: 221,
        age: 4,
        bdate: "2020-05-27T15:00:00-04:00",
        type: "Ұрғашы бұзау",
        statusChangeTime: "2020-10-19T04:27:05.000Z",
      },
      {
        vid: 225,
        age: 6,
        bdate: "2020-07-09T15:00:00-04:00",
        type: "Ұрғашы бұзау",
        statusChangeTime: "",
      },
      {
        vid: -34,
        age: 7,
        bdate: "2020-02-21T14:00:00-05:00",
        type: "Ұрғашы бұзау",
        statusChangeTime: "2020-10-17T05:17:55.000Z",
      },
      {
        vid: -30,
        age: 4,
        bdate: "2019-01-03T14:00:00-05:00",
        type: "Еркек бұзау",
        statusChangeTime: "2019-05-06T07:24:00.000Z",
      },
    ]
      .map((item) => +("" || item.bdate).split("-")[0])
      .filter((y, i, a) => a.indexOf(y) === i);


    Выведет

    > [2020, 2019]
    Ответ написан
    2 комментария
  • Как фиксировать время выполнения каждого вопроса в Гугл Формах?

    oshliaer
    @oshliaer
    Google Products Expert
    Никак. Такой опции нет.
    Ответ написан
    Комментировать
  • IFERROR в гугл таблицах. Почему если выбрано первое значение, второе уже не проверяется?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    Суть в том, что для очереди принятия решения IFS характерна линейность, сводящаяся к принципу "кто первый, тот и решение". Т.е., если вы поменяете строки таким образом, то вы получите нужный результат

    K6 = TRUE, iferror(QUERY(Pricelist!$A:$U,"select U where A like '"&$D5&"'",0),""),
    I5 = TRUE, iferror(QUERY(Pricelist!$A:$R,"select R where A like '"&$D5&"'",0),""),
    I6 = TRUE, iferror(QUERY(Pricelist!$A:$S,"select S where A like '"&$D5&"'",0),""),
    I7 = TRUE, iferror(QUERY(Pricelist!$A:$T,"select T where A like '"&$D5&"'",0),""),


    5ffd7efa79ac2644845990.png

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

    Идеальным решением можно предположить селектор: это когда все решения имеют однозначные веса, вне зависимости от очереди.

    • I5 = TRUE- это 1
    • I6 = TRUE - это 2
    • I7 = TRUE - это 5
    • K6 = TRUE - это 9


    Вам нужно проверить, если сумма всех проверок 1, то включен только I5, если 3 - I5 и I6, если 12 - I5 и I6 и K6 и т.п. Теперь вы можете выбирать решение по вкусу - вы знаете все варианты.
    Ответ написан
  • Как перенести данные из столбца?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    Возможно, вам подойдет вот это

    =ARRAYFORMULA(IFERROR(
      SPLIT(
        VLOOKUP(
          B:B,
          {ADDRESS(ROW(A:A),COLUMN(A:A),4),A:A},
          2,
          0
        ),
      "[\[\]]")
    ))


    5ffc0c28b8657634958834.png

    Обратите внимание, что формула должна быть внесена в первую строку Таблицы.
    Ответ написан
    Комментировать
  • Интеграция Microsoft 365 и GSuite?

    oshliaer
    @oshliaer
    Google Products Expert
    Насколько я знаю, Microsoft 365 имеет мало отношения к настройке Active Directory.

    Google Cloud Directory Sync позволяет синхронизацию с любым сервисом по LDAP или AD. Обратите внимание, что GCDS не переносит данные, а "связывает" учетные записи по вашим правилам.
    Для приложений и сервисов вам также понадобится настроить Cloud Identity.
    Ответ написан
    Комментировать
  • Google таблицы: трансформация текста в дату и время, как?

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

    =DATE(
      REGEXEXTRACT(A1,"(\d{4})"),
      SWITCH(REGEXEXTRACT(A1,"\w{3}"),"Jan",0,"Feb",1,"Mar",2,"Apr",3,"May",4,"Jun",5,"Jul",6,"Aug",7,"Sep",8,"Oct",9,"Nov",10,"Dec",11),
      REGEXEXTRACT(A1,"(\d{2}),")
    )
    +
    TIME(
      IF(REGEXMATCH(A1,"PM"),12,0)+REGEXEXTRACT(A1,"(\d{2}):"),
      REGEXEXTRACT(A1,":(\d{2})"),
      0
    )


    5ffbe39783c2f860252703.png

    К сожалению, всё это сильно зависит от формата строки.

    Формула для массива

    =ARRAYFORMULA(
      DATE(
        REGEXEXTRACT(A1:A12,"(\d{4})"),
        SWITCH(REGEXEXTRACT(A1:A12,"\w{3}"),"Jan",0,"Feb",1,"Mar",2,"Apr",3,"May",4,"Jun",5,"Jul",6,"Aug",7,"Sep",8,"Oct",9,"Nov",10,"Dec",11),
        REGEXEXTRACT(A1:A12,"(\d{2}),")
      )
      +
      TIME(
        IF(REGEXMATCH(A1:A12,"PM"),12,0)+REGEXEXTRACT(A1:A12,"(\d{2}):"),
        REGEXEXTRACT(A1:A12,":(\d{2})"),
        0
      ))


    Возможно, SWITCH - не лучшая идея. Можно заменить на MATCH

    =ARRAYFORMULA(
      DATE(
        REGEXEXTRACT(A2:A100;"(\d{4})");
        MATCH(REGEXEXTRACT(A2:A100;"\w{3}");{"Jan";"Feb";"Mar";"Apr";"May";"Jun";"Jul";"Aug";"Sep";"Oct";"Nov";"Dec"};0)-1;
        REGEXEXTRACT(A2:A100;"(\d{2}),")
      )
     +
      TIME(
        IF(REGEXMATCH(A2:A100;"PM");12;0)+REGEXEXTRACT(A2:A100;"(\d{2}):");
        REGEXEXTRACT(A2:A100;":(\d{2})");
        0
      )
     )
    Ответ написан
    4 комментария
  • Установка даты в соседний столбец по флажку true?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Добавьте скрипт к вашей Таблице

    /**
     *
     */
    function onEdit(e) {
      const sheetName = 'Sheet6'; // Имя листа, который отслеживается
      const colToStamp = 7; // Номер колонки для даты
    
      if (e && e.range && e.range.getRow() > 9 && e.range.getColumn() == 6) {
        const sheet = e.range.getSheet();
        if (sheet.getName() == sheetName) {
          const writeVal =
            e.value == true || e.value == 'TRUE' || e.value == 'ИСТИНА'
              ? new Date()
              : '';
          sheet.getRange(e.range.rowStart, colToStamp).setValue(writeVal);
          SpreadsheetApp.getActive().toast('Обновлено');
        }
      }
    }


    https://github.com/contributorpw/google-apps-scrip...

    Пример https://docs.google.com/spreadsheets/d/1LZi-bTd8-P...
    Ответ написан
    Комментировать