Задать вопрос
Ответы пользователя по тегу Google Sheets
  • Как посмотреть список экспортов в другие гугл-таблицы на стороне гугл-таблицы источника данных?

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

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Apps Script

    function myFunction() {
      const range = SpreadsheetApp.getActiveSpreadsheet().getRange("C11");
      const value = range.getValue();
      const newValue = String(value).replace(/^.*?«(.*)».*$/gmi, "$1");
      range.setValue(newValue);
    }


    Или используйте формулу для работы с регулярными выражениями

    =REGEXEXTRACT(C11;"«(.*)»")

    67c1cae5440ef365069037.png
    Ответ написан
  • Какую формулу можно использовать для переноса данных диапазона в рамках одного листа?

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

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

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    Данные, которые отсутствуют в списке

    Выбрать имена, которых нет в списке. Список в I15:I19
    67beb4c91447b627589374.png

    =FILTER('Данные'!A2:F;ISNA(MATCH('Данные'!B2:B;I15:I19;0)))


    Больше примеров тут https://oshliaer.github.io/qna?target=post/google-...
    Ответ написан
    Комментировать
  • Как сделать нумерацию без пересчёта удалённых строк?

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

    Самое простое, можно использовать Google Apps Script
    Ответ написан
    Комментировать
  • Почему не удается вставить полученный из цикла массив?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    The parameters (number,number,number,null) don't match the method signature for SpreadsheetApp.Sheet.getRange.


    Означает, что вы в метод getRange передаете аргументы несвойственные его сигнатуре. Обратите внимание, что четвертый аргумент null, а это значит, что ваш вызов arr[0].length возвращает null. Что в свою очередь означает, что ваш массив arr содержит первый элемент, у которго отсутствует свойство length. Что очевидно, т.к. obj - не массив, см. тут obj[sh.getName()] = sh.getDataRange().getValues();

    Дальше мне было лень

    Давайте починим код. Ошибка возникает из-за того, что вы пытаетесь использовать метод `getRange(1, 1, arr.length, arr[0].length)` с некорректными параметрами. Кроме того, есть несколько других проблем в коде, которые нужно исправить:

    1. Пустые URL-адреса: Вы фильтруете массив ссылок, но не проверяете, действительно ли они являются действительными URL-адресами.
    2. Структура данных: В вашем коде arr становится объектом, а не массивом, и это вызывает проблемы при использовании setValues.
    3. Логика записи данных: Метод setValues ожидает двумерный массив, но ваша структура данных не соответствует этому требованию.


    Вот исправленная версия кода:

    function sv21() {
      // Открываем основную таблицу
      var ss1 = SpreadsheetApp.openByUrl('URL_ОСНОВНОЙ_ТАБЛИЦЫ'); // Замените на реальный URL
      var sheet1 = ss1.getSheetByName('ссылки');
      
      // Получаем ссылки из столбца B
      var urls = sheet1.getRange('B3:B').getValues().flat(); // Берем значения из столбца B
      urls = urls.filter(function (url) { // Удаляем пустые строки
        return url !== '' && url.startsWith('https://'); // Проверяем, что это действительно URL
      });
    
      var allData = []; // Здесь будем хранить все данные
    
      // Проходимся по каждой ссылке
      for (var i = 0; i < urls.length; i++) {
        try {
          var ss = SpreadsheetApp.openByUrl(urls[i]); // Открываем таблицу по URL
          ss.getSheets().forEach(function (sh) {
            var data = sh.getDataRange().getValues(); // Получаем данные с листа
            allData = allData.concat(data); // Добавляем данные в общий массив
          });
        } catch (e) {
          Logger.log('Ошибка при обработке URL: ' + urls[i] + '. Подробности: ' + e.message);
        }
      }
    
      // Если есть данные для записи
      if (allData.length > 0) {
        // Открываем целевую таблицу и записываем данные
        var targetSheet = SpreadsheetApp.openByUrl('URL_ЦЕЛЕВОЙ_ТАБЛИЦЫ') // Замените на реальный URL
          .getSheetByName('все расчеты');
        
        // Очищаем предыдущие данные
        targetSheet.clearContents();
        
        // Записываем новые данные
        targetSheet.getRange(1, 1, allData.length, allData[0].length).setValues(allData);
      } else {
        Logger.log('Нет данных для записи.');
      }
    }


    Что было исправлено:
    1. Обработка URL-адресов:
    - Добавлена проверка на то, что ссылка начинается с https://.
    - Используется метод `.flat()` для преобразования многомерного массива в одномерный.

    2. Сбор данных:
    - Все данные собираются в массив allData, который затем используется для записи в целевую таблицу.

    3. Запись данных:
    - Перед записью данных очищается содержимое целевого листа (clearContents).
    - Проверяется, что массив allData не пустой, прежде чем выполнять запись.

    4. Обработка ошибок:
    - Добавлен блок try-catch для обработки ошибок при открытии таблицы по URL.

    5. Логирование:
    - Логируется информация об ошибках, чтобы легче было находить проблемы.

    Как использовать:

    1. Замените 'URL_ОСНОВНОЙ_ТАБЛИЦЫ' и 'URL_ЦЕЛЕВОЙ_ТАБЛИЦЫ' на реальные URL-адреса ваших таблиц.
    2. Убедитесь, что у скрипта есть необходимые права доступа к таблицам.


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

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Все очень просто, даже Жпт справится:

    1. Копируете лист
    2. Очищаете только от данных
    3. Берете данные из оригинального листа
    4. Вставляете в копию
    5. Переименовываете копию, как надо
    6. Готово
    Ответ написан
    Комментировать
  • Что применить для нужной мне фильтрации обработанных строк в Таблицах?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    Я бы советовал не сохранять данные на том же листе - со временем их будет неудобно сортировать. Лучше всего переносить данные на другой лист или Таблицу. Для этого необходимо использовать Google Apps Script или другую программу.

    Как это может работать на примере Мастера Каталога https://googlesheets.ru/kak-perenesti-stroku-iz-ta...

    67b1b838917b2697480492.gif
    Ответ написан
    Комментировать
  • Как учесть списание комплектующих по спианию продукта?

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

    =LET(
      _goods;FILTER(C2:C;C2:C<>"");
      REDUCE({""\""};_goods;LAMBDA(_acc;_cur;{_acc;IFNA(FILTER('Товары'!B:C;'Товары'!A:A=_cur))}))
    )


    678e5cf4dd231230604895.png

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

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    =LEFT(A3,LEN(A3)-2)
    =REGEXEXTRACT(A3,"(.*).{2}")

    678e3b02ab76d523261021.png

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

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    Штатными средствами эту задачу можно решить только с подпиской Google Workspace. Новость https://t.me/contributor_pw/517

    В противном случае, я бы не делал проверку каждой ячейки - это может быть накладно. Проще создать формулу, которая соберет все значения в один текст. Далее Скриптом проверять наличие текста в этой ячейке каждую минуту: текст есть - отправить уведомление. Не забудьте записывать, что уведомление было отправлено, иначе каждую минуту будет отправляться одно и тоже.
    Ответ написан
    Комментировать
  • Как настроить логирование действий других пользователей?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    К сожалению, у Session.getActiveUser().getEmail() есть серьезные ограничения

    getEmail() Получает адрес электронной почты пользователя, если он доступен. Если политики безопасности не разрешают доступ к адресу электронной почты пользователя, этот метод возвращает пустую строку. Обстоятельства, при которых адрес электронной почты доступен, различаются: например, адрес электронной почты пользователя недоступен ни в одном контексте, который позволяет скрипту запускаться без авторизации этого пользователя, например, простой триггер onOpen(e) или onEdit(e), пользовательские функции в Google Таблицах или веб-приложение, развернутое для "выполнения от моего имени" (то есть авторизованное разработчиком вместо пользователя). Однако эти ограничения, как правило, не применяются, если разработчик сам запускает скрипт или принадлежит к тому же домену Google Workspace, что и пользователь.

    https://developers.google.com/apps-script/referenc...

    Т.о. то, что вы запускаете, может отработать только в Googlw Workspace
    Ответ написан
  • Почему не работает регулярное выражение?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    Ваша формула работает хорошо, вы передаете неправильный аргумент

    нужно

    =VALUE(REGEXEXTRACT(E2;"[\/](\d+)(спб|мск)[\/]"))

    67586636c4f8e927848185.png

    Для массива данных используйте что-то такое

    =ARRAYFORMULA(VALUE(REGEXEXTRACT(C3:C4;"[\/](\d+)(?:спб|мск)[\/]")))


    Пример в Таблице https://docs.google.com/spreadsheets/d/1oAU_ZMFFYi...
    Ответ написан
    4 комментария
  • Как перенести значения ячеек из одного листа в новую строку другого?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    Вы можете воспользоваться готовым решением

    catalog-master-intro-01.gif

    https://docs.google.com/spreadsheets/d/113KPUP5NwD...

    Инструкция тут https://googlesheets.ru/kak-perenesti-stroku-iz-ta...
    Ответ написан
    Комментировать
  • Как изменить формулу TO_PERCENT, чтобы она считала данные, соответствующие условию?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    Самое простое - это не считать M3 и M4, а сразу расчитать в формуле

    =LET(
      _B,"Начисление",
      _J,"Да",
      _M3,SUMIF(B2:B,"="&_B,G2:G),
      _M4,SUMIF(J2:J,"="&_J,I2:I),
    TO_PERCENT(((_M4+_M3)-_M3)/_M3))


    6703bf16f280d058650216.png

    Ну, или посчитатйте

    SUMIF(B2:B,"Начисление",G2:G)
    SUMIF(J2:J,"Да",I2:I)
    Ответ написан
    2 комментария
  • Как сделать ценники?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    Как? Очень просто - наймите кого-то на Фрилансим https://freelance.habr.com/

    Не нарушайте правила - домашняя работа и задания запрещены.
    Ответ написан
    Комментировать
  • Из-за чего не совпадает номер ячейки по API?

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

    Скорее всего, ошибка где-то в опечатке адреса или кода.
    Ответ написан
    Комментировать
  • Как сделать линейную таблицу через сводную?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    Используйте что-то простое для начала, например

    =ArrayFormula(SPLIT(FLATTEN(G4:I4&""&F5:F7&""&G5:I7);""))


    66d2e605b9e64701136757.png

    Пример в Таблице https://docs.google.com/spreadsheets/d/1qdh4mQLiEL...
    Ответ написан
    Комментировать
  • Как работает формула ROUND?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    Округляет до двух нулей перед запятой

    Напрмиер, =ROUND(324123,234;-2)

    вернет 324100

    , а =ROUND(324193,234;-2)

    вернет вернет 324200

    66d1cc57abad6641640695.png
    Ответ написан
    1 комментарий
  • Как сделать текст жирным при конкатенации строк?

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

    Вот рабочий код на Google Apps Script

    /* exported combineCells */
    /**
     * Combines strings from two cells in a row into a single cell.
     * The combined string is bolded if the first cell is not empty.
     */
    function combineCells() {
      const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
      const sheet = spreadsheet.getSheetByName('Соединение строк построчно');
      const dataRange = sheet.getDataRange();
      const values = dataRange.getValues();
    
      const newValues = values.map((row) => {
        const cellA = row[0];
        const cellB = row[1];
    
        let formattedText = null;
        if (String(cellA).length > 0) {
          formattedText = SpreadsheetApp.newRichTextValue()
            .setText(String(cellA) + ' ' + String(cellB))
            .setTextStyle(0, String(cellA).length, SpreadsheetApp.newTextStyle().setBold(true).build());
        } else {
          formattedText = SpreadsheetApp.newRichTextValue().setText(String(cellB));
        }
    
        return [formattedText?.build()];
      });
    
      const targetRange = dataRange.offset(0, 2, dataRange.getNumRows(), 1);
      targetRange.setRichTextValues(newValues);
    }


    Пример в Таблице https://docs.google.com/spreadsheets/d/1qdh4mQLiEL...
    Как запускать Скрипты https://googlesheets.ru/script-editor-guide/
    Ответ написан
    Комментировать