Задать вопрос
  • 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...
    Ответ написан
    Комментировать
  • Как решить проблему при копировании ячейки из одной Таблицы в другую?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    Хм...

    Это очень странно, т.к. вы должны мочь скопировать все, кроме валидации данных и защиты диапазонов.

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

    К сожалению, я не могу повторить это у себя. Добавьте описание и как это повторить. Пришлите Таблицы, в которых вы это делаете.

    Если сброс кук и инкогнито не помогут, то создайте топик тут https://support.google.com/docs/community?hl=en и пришлите мне ссылку, я попробую открыть баг. Пишите по-русски - это не проблема.
    Ответ написан
  • Как прописать свою формулу для условного форматирования?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    5fe979517035d395854168.png

    Возможно, достаточно настроить условное форматирование:
    1. указать диапазон заливки
    2. выбрать пользовательские функции
    3. ввести функцию со знаком $. Это заставит "заливаться" всю строку
    Ответ написан
    Комментировать
  • Как ежедневно автоматически сохранять значение ячейки в Google Таблицах?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Самое простое - это создать скрипт и подключить триггер времени.

    Добавьте код в проект к Таблице

    /**
     *
     */
    function createTrigger() {
      ScriptApp.getProjectTriggers().forEach(
        (trigger) =>
          trigger.getHandlerFunction() === 'saveData' &&
          trigger.getEventType() === ScriptApp.EventType.CLOCK &&
          (ScriptApp.deleteTrigger(trigger) ||
            console.info(`Tirgger ${trigger.getUniqueId()} was deleted`))
      );
      // every minutes for testing
      // ScriptApp.newTrigger('saveData').timeBased().everyMinutes(1).create();
      // at 9 o'clock every days
      ScriptApp.newTrigger('saveData').timeBased().atHour(9).everyDays(1).create();
    }
    
    /**
     *
     */
    function saveData() {
      const book = SpreadsheetApp.openById(
        '1FUSSiDQoXyvKXfzYydoUUfcCGYq_TskpRiwfb28_1Z0'
      );
      const sheet = book.getSheetByName('Лист1');
      const value = sheet.getRange('A1').getValue();
      book.getSheetByName('Лист2').appendRow([new Date(), value]);
      console.info(`saveData was called successful`);
    }


    Не забудьте поменять ID Таблицы 1FUSSiDQoXyvKXfzYydoUUfcCGYq_TskpRiwfb28_1Z0 на ваш.

    Таблица должна содержать два листа: "Лист1" и "Лист2". Программа с 9 до 10 утра один раз читает значение из ячейки Лист1!A1 и добавляет новую строку на Лист2.

    Вызовите из редактора функцию createTrigger один раз.

    Пример Таблицы с кодом https://docs.google.com/spreadsheets/d/1FUSSiDQoXy...

    На картинке красным пометил то, что нужно нажимать. Синим - нужно изменить перед первым запуском.
    5fe4bd91d80c7094551103.png
    Ответ написан
  • Как посчитать данные из массива с определенным условием?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    Возможный вариант

    5fe2c94e4d3ae330529395.png

    =ARRAYFORMULA(QUERY(
      SPLIT(FLATTEN(B2:B6 & "♡" & C2:C6 & "♡" & D2:G6);"♡");
      "select Col1, Col2, Col3, count(Col3) 
       where Col3 is not null 
       group by Col1, Col2, Col3 label count(Col3)''"
    ))


    https://docs.google.com/spreadsheets/d/1ziMImIx8Gc...
    Ответ написан
    Комментировать
  • Как при создании новой строки в таблице заполнить 3 столбец данной строки текущей датой?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    Такого события нет.

    И вообще, событийная модель Таблиц - так себе система. Существует два триггера: для события EDIT и CHANGE. При добавлении новой строки будет вызвано событие CHANGE. Вы можете его перехватить соответствующим триггером. Который, к сожалению, ничего особенно умного не вернет. Если только вы не обработаете это событие целиком:
    • Проверите лист
    • Проверите ВСЕ данные на листе
    • Заполните пустые ячейки текущей датой


    То еще занятие ...
    Ответ написан
    Комментировать
  • Можно ли после заполнения формы открывать доступ к какому либо файлу или ссылке?

    oshliaer
    @oshliaer
    Google Products Expert
    К сожалению, Формы Гугл поддерживают только постоянные ссылки в виде общего сообщения после отправки Формы.

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

    Думаю, можно сделать какой-то простой скрипт, который бы отправлял сообщение пользователю на email после отправки Формы.
    Ответ написан
    Комментировать
  • Флажок в Google таблицах с условием?

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

    5fd822dcee0c2639900150.png

    https://docs.google.com/spreadsheets/d/1OlbkEDvUA0...

    Как копировать валидацию.
    1. В любую ячейку своих данных устанавливаете валидацию
    2. Копируете эту ячейку
    3. Выделяете диапазон своих результатов
    4. Делаете специальную вставку - только валидация
    Ответ написан
    Комментировать
  • Как в функцию QUERY добавить новые Col?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    Обновите до

    =ARRAYFORMULA(QUERY((
      {
        QUERY(
          FLATTEN(IFERROR(SPLIT('Данные'!B:B, ", ", 0))),
          "WHERE Col1 IS NOT NULL",
          0
        ),
        VLOOKUP(
          QUERY(
            FLATTEN(IF(IFERROR(SPLIT('Данные'!B:B, ", ", 0)) = "",, ROW('Данные'!A:A))),
            "WHERE Col1 IS NOT NULL",
            0
          ),
          {
            ROW('Данные'!A:A),
            'Данные'!A:A,
            'Данные'!C:P
          },
          COLUMN('Данные'!B:P),
          0
        )
      }),
      "SELECT Col2, Col1, Col" & JOIN(", Col", COLUMN('Данные'!C:P)) & "
      FORMAT Col2 'yyyy-mm-dd hh:mm:ss'",
      1
    ))
    Ответ написан
    Комментировать
  • Как выполнить формулу в нотации GOOGLE SHEETS, собранную из фрагментов текста, используя пользовательскую функцию?

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

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    Самое простое, это проверить адрес ячейки

    function sampleName(e){
      // Если изменилась ячейка B5 пользователем
      if (e && e.range && e.range.getColumn() == 2 && e.range.getRow() == 5) { 
        // тут все делается
      }
    }

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

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    Я рекомендую скрипт.

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

    Сначала, справа от ваших данных нужно разбить колонку в которой находятся перечисляемые данные. Обратите внимание, что этих колонок может быть много (столько сколько у вас уникальных значений, в вашем случае направлений).

    5fc9046ab40da210800326.png

    Далее, уже на другом листе, вы создаете массив из массивов всех вариантов и фильтруете его. Количество массивов зависит от числа уникальных значений, которые можно получить, если перебрать все значения в ячейках для разбития. И это самая трудная задача. Если у вас 20 и более значений, то формула может приобрести чудовищные размеры. В данном случае значений всего три "Яблоки, Груши, Сливы".

    5fc904fbd90fc820384161.png

    Таблица с примером https://docs.google.com/spreadsheets/d/1hmbgD-nW7w...
    Ответ написан
    Комментировать
  • Как создавать пустую строку при отсутствии возвращаемых данных?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    Не самое лучшее решение, но можно попробовать, если структура данных не будет часто меняться

    5fc7b08683c51408160522.png

    Собираем данные

    5fc7b12029493261083554.png

    Берем уникальные позиции

    5fc7b134523bd474857090.png

    Берем уникальные даты

    5fc7b14611b07421562688.png

    Строим нулевые записи со всеми возможными комбинациями

    5fc7b163014e4192309262.png

    Выбираем те, которых нет

    5fc7b176c2d7f296501603.png

    Пример https://docs.google.com/spreadsheets/d/1kZWMci2QUa...
    Ответ написан
  • Как дописывать в гугл таблицу значения при сабмите формы с помощью developers.google.com/sheets/api/?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    Чтобы воспользоваться такой возможностью, в целях безопасности, вам нужно использовать промежуточный сервер, который будет авторизироваться за вас. Это может быть минимальный облачный сервер, или облачная функция, или опубликованное веб-приложение на Google Apps Script.
    Ответ написан
    Комментировать
  • Есть формула =h1-f1 а как с текстом или отдать приоритет f1 чем h1?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    5fc073f883dfa237868811.png

    Возможно, подойдет

    =IFERROR(C2-A2;E2)
    Ответ написан
    Комментировать
  • В чем ошибка при использовании формул массива?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    Может обход по ARRAYFORMULA надо начинать с C6?

    5fc0145f66e6c982170033.png

    ={"Статья";ARRAYFORMULA(IFERROR(VLOOKUP(C6:C;'Справочник'!B:D;3;0)))}
    Ответ написан
  • Как разнести данные по ячейкам из вложенного списка?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    5fc011e6b5fea796277110.png

    Вам нужен процесс сплющивания объектов. Погуглите термин "flatten".

    Для текущей спецификации Google Apps Script можно попробовать использовать следующий код

    /**
     * @see https://gist.github.com/penguinboy/762197#gistcomment-3448642
     */
    function flatten(object, path = null, separator = '.') {
      return Object.keys(object).reduce((acc, key) => {
        const value = object[key];
        const newPath = Array.isArray(object)
          ? `${path ? path : ''}[${key}]`
          : [path, key].filter(Boolean).join(separator);
        const isObject = [
          typeof value === 'object',
          value !== null,
          !(value instanceof Date),
          !(value instanceof RegExp),
          !(Array.isArray(value) && value.length === 0),
        ].every(Boolean);
    
        return isObject
          ? { ...acc, ...flatten(value, newPath, separator) }
          : { ...acc, [newPath]: value };
      }, {});
    }


    Тогда ваш код можно запустить вот так

    /**
     *
     */
    function myFunction() {
      const response = {
        result: {
          items: [
            {
              product_id: 253611,
              offer_id: 'УТ-00007992',
              stock: {
                coming: 0,
                present: 100,
                reserved: 23,
              },
            },
            {
              product_id: 253616,
              offer_id: 'УТ-00007043',
              stock: {
                coming: 0,
                present: 23231,
                reserved: 1,
              },
            },
          ],
          total: 20,
        },
      };
      const arr = response['result']['items'];
    
      const data = [];
    
      arr.forEach((el) => data.push(Object.values(flatten(el))));
    
      SpreadsheetApp.getActive()
        .getSheetByName('имя')
        .getRange(1, 1, data.length, data[0].length)
        .setValues(data);
    }
    Ответ написан
    1 комментарий
  • Как рассчитать знак зодиака в Google-таблице?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    5fc00bf20a35d412975445.png

    Попробуйте VLOOKUP

    Например, у вас есть справочник сотрудников и знаков зодиака. В последнем нужно сделать индексы, чтобы поиск происходил в заданном диапазоне. Индекс - это целое число, которое собирается из единицы и начала действия знака в календаре. Например, Лев начинается 23 июля, значит его индекс будет записан как число, состоящее из цифр 1, 06, 23, т.е. 10623.

    Чтобы узнать индекс для сотрудника, нужно вызвать формулу VALUE(TEXT(A1;"1MMDD"), где в A1 дата рождения сотрудника.

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

    =ARRAYFORMULA(IF(B2:B;IFERROR(
      VLOOKUP(
        VALUE(TEXT(B2:B;"1MMDD"));
        SORT({'Знаки. Спаравочник'!J:J\'Знаки. Спаравочник'!A:L};1;1);
        2;
        1
      )
    );""))


    Проверяем, чтобы в B2:B было значение, иначе выводим пустую строку, далее в составном диапазоне
    {'Знаки. Спаравочник'!J:J\'Знаки. Спаравочник'!A:L}
    ищем индекс по колонке J:J, т.е. "Западная астрология (вариант II)".

    Чтобы вывести еще и стихии с планетами, можно добавить список колонок для вывода

    =ARRAYFORMULA(IF(B2:B;IFERROR(
      VLOOKUP(
        VALUE(TEXT(B2:B;"1MMDD"));
        SORT({'Знаки. Спаравочник'!J:J\'Знаки. Спаравочник'!A:L};1;1);
        {2\3\4\5\6};
        1
      )
    );""))


    Ответ написан
    8 комментариев
  • Как проверить наполнение таблицы?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    К сожалению, API по истории так и нет.

    Я, например, проверяю дату изменения, сравниваю с кешем, беру хэш от требуемого диапазона, если хэши неравны, то начинаю сравнивать массивы (в питоне алгоритмов завались ).
    Ответ написан