Ответы пользователя по тегу Google Apps Script
  • Не могу определится в верном выборе триггера simple or installable?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Триггера "onEdit" не существует. Существует простой и устанавливаемый триггер события "Edit". onEdit - зарезервированное имя функции для простого триггера.

    Простой триггер срабатывает для каждого, устанавливаемый - для того, кто установил.

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

    В обычных Таблицах (не Workspace), если пользователь вам не представился, не ищите возможности его идентифицировать, Гугл все время добавляет ограничения на эти действия, поэтому потом вы свой "прекрасный код" будете называть "костылями", а потом он вообще перестанет работать. Это бесплатно, а значит ограничено.
    Ответ написан
    Комментировать
  • Как скриптом достать ссылку из ячейки?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Самое простое, это взять ячейку, у нее есть метод getRichTextValue(), возвращаемый объект имеет метод getLinkUrl().

    cell.getRichTextValue().getLinkUrl();

    Извлечь ссылки из диапазона

    /**
     *
     * @param {GoogleAppsScript.Spreadsheet.Range} ref
     */
    function extractLink_(ref) {
      const richTextValues = ref.getRichTextValues();
      return richTextValues.map((row) =>
        row.map((cell) => {
          return cell.getLinkUrl();
        }),
      );
    }


    65d0548379b9c072210595.png

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

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Решение Григорий Боев https://qna.habr.com/answer?answer_id=2404940#answ... единственное.

    Более удобным может быть настройка Gmail на отправку писем от имени других аккаунтов, даже аккаунтов Microsoft Live или как там сейчас их MySpace называется.

    Еще вариант, забирать данные из Таблицы вашим клиентом Outlook, который, тоже содержит "макросы" и прочее, прочее. На Таблицах и Скриптах свет клином не сошелся, хоть они и самый удобный инструмент.
    Ответ написан
    Комментировать
  • Почему перестает определяться пользовательская функция после определенного времени?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Однозначного ответа нет. Кстати, этим вы нарушаете правила ресурса. Вот несколько вариантов:
    • Неудачно написанный код, глобальные объекты, запрещенный вызов, авторизация
    • Ожидание загрузки, тяжелая Таблица
    • Плохая Таблица (тут можно попробовать сделать копию)
    Ответ написан
    Комментировать
  • Как переместить определенную строку на другой лист и в другую Таблицу?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Это можно сделать только программно.

    Специально для таких вопросов сделали пример https://googlesheets.ru/kak-perenesti-stroku-iz-ta...

    Обратите внимание, там данные переносятся на лист с тем же именем, что и данные в ячейке, но код написан таким образом, чтобы его можно было применить для подобных задач. Например, такой как ваша.
    Ответ написан
    Комментировать
  • Как разрешить редактирование листа сегодняшней даты?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Это делается через Google Apps Script.
    Ответ написан
  • Как реализовать уведомления по диапазону ячеек при изменении формулами?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Есть несколько подходов:

    1. Например, можно поставить весь диапазон в свою формулу и сравнивать с результатами из кеша. Если данные не совпадают, то реагировать
    2. Периодично проверять по дате изменения файла. Если дата изменилась, то реагировать
    3. Проверять через Google Actions API. Если файл был упомянут, то реагировать


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

    Кстати, задания оставлять нельзя по правилам сообщества.
    Ответ написан
    Комментировать
  • Можно ли сделать кнопку в ячейке, которая будет иметь три состояния (0, 1, 2) - смена состояния при нажатии?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Это не самая лучшая идея, но такое возможно. Не думаю, что это было возможно, когда был задан этот вопрос, т.к. существовали некоторые проблемы с отображением картинок. Они и сейчас есть, но обходными путями, т.е. изменением размера, можно добиться динамики (от слова "псевдо").

    Весь процесс я заснял на видео

    658e9148b79f6345031533.gif

    В Таблице https://docs.google.com/spreadsheets/d/126GtwkfPVp... можно увидеть пример.

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

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

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Скрипты предполагают, что вы используете общее пространство имен, а система модулей (файлов) для которой предназначен линтер -- каждый файл является закрытым пространством имен. Поэтому либо делать комментарий

    /* global SuperClass */

    Либо писать на Typescript.
    Ответ написан
    Комментировать
  • Как правильно создать 2-мерный массив и заполнить его через push (google script)?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Укажите в цикле в условии следующий код

    arrNewData.push([arrData[n].join()]);

    658337b02dc32296078446.png

    Полное решение в Таблице https://docs.google.com/spreadsheets/d/126GtwkfPVp... Скрипт в одноименном с листом файле.
    Ответ написан
    2 комментария
  • Как сделать чтобы скрипт копировал таблицу на новый лист?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Это делается с помощью google Apps Script.

    Методы копирования формата есть в классе Range. Документации должно быть достаточно.
    Ответ написан
  • Как правильно использовать переменную даты в Json запросе?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Таблицы не умеют отправлять POST. Тут вы начинаете лукавить. Скорее всего вы используете Apps Script.

    Берите нормальную дату, преобразуйте и передавайте в объект запроса

    Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'yyyy-MM-dd');
    Ответ написан
    Комментировать
  • Как копировать данные с одного листа на другой только в ячейки строк, в которых есть данные?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Если коротко, то
    1. берете данные источника
    2. берете данные приемника
    3. обходите данные приемника по условию и заполняете пропуски
    4. записываете данные в приемник


    Обновлено

    654da1e519058534944401.gif

    Еще немного видео-объяснений тут https://t.me/contributor_pw_chat/10562

    Может копировать как фон, так и комментарии

    Задачи, которые решаются в примере

    Задача 1. Перенос данных

    Необходимо перенести из листа в лист, если в C есть дата

    function runMoveData() {
      // Лист-источник
      const frm = SpreadsheetApp.getActive().getSheetByName('Перенос или копирование строк. База');
      // Лист-приемник
      const to = SpreadsheetApp.getActive().getSheetByName('Перенос или копирование строк');
      // Проверка для каждой строки: если 3й элемент дата, то переноси
      const condition = (row) => !!row[2]?.getTime;
      moveData_(frm, to, condition, { colors: true, notes: true });
    }


    Задача 2. Копирование данных

    Необходимо скопировать из листа в лист, если в C есть дата и такой даты нет в приемнике

    // Лист-источник
      const frm = SpreadsheetApp.getActive().getSheetByName('Перенос или копирование строк. База');
      // Лист-приемник
      const to = SpreadsheetApp.getActive().getSheetByName('Перенос или копирование строк');
      // Преобразователь в значение для сравнения
      const toValue = (data) => (data?.getTime ? data.getTime() : data);
      // Индекс приемника, то что в нем уже есть
      const toIndex = to
        .getDataRange()
        .getValues()
        .map((row) => toValue(row[2]));
      // Проверка для каждой строки: если третий элемент дата и такого значения нет в примнике, то копируй
      const condition = (row) => row[2]?.getTime && !toIndex.includes(toValue(row[2]));
      moveData_(frm, to, condition, { colors: true, notes: true, leaveCopy: true });


    Ссылка на Таблицу с кодом https://docs.google.com/spreadsheets/d/1wJyI3ieRDN...
    Ответ написан
    Комментировать
  • Как добавить условие в скрипт Google Таблицы?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Переписал ваш код под свое обычное применение -- ничего особенного не выявил, только проверки на слово "Готово" нет, а так все должно работать

    65431642cf71c280933778.gif

    65431669ad922454979355.png

    Решение в Таблице https://docs.google.com/spreadsheets/d/1IHDKe-5Tzv...
    Ответ написан
    Комментировать
  • Есть ли способ разрешить раскрывать/сворачивать строки (по клику на +), если они попадают в защищенный от редактирования диапазон?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Есть, но решение вам не понравится.

    Это, кстати, не "проблема", а ожидаемое поведение.

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

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Вы должны копировать валидацию данных для этого

    /**
     *
     * @param {string} companyName
     * @param {string} contactName
     * @param {('Да'|'Нет')} informStatus
     * @param {string} phone
     * @param {string} email
     * @returns
     */
    function addCompany_(companyName, contactName, informStatus, phone, email) {
      var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Создавать список и чекбокс');
    
      // Создаем объекты для чекбокса и компании
      var company = companyName;
    
      const companyId = `${String(companyName).toUpperCase().replace(/\s+/, '_')}_${new Date()}`;
    
      var newRow = [companyId, false, company, contactName, informStatus, phone, email];
      const lr = sheet.getLastRow() + 1;
      sheet.appendRow(newRow);
    
      const validations = sheet.getRange('2:2').getDataValidations();
    
      sheet.getRange(`${lr}:${lr}`).setDataValidations(validations);
    
      return companyId;
    }
    
    /* exported runAddCompany */
    function runAddCompany() {
      addCompany_(`Comp_${new Date().getTime()}`, 'Contact', 'Да', '77777777777', 'qerwerq@afaffa.ru');
    }


    653b99da4c447869296536.gif

    Пример в Таблице
    Ответ написан
    2 комментария
  • Гуглтаблица сводная как узнать цвет заливки ячейки?

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

    Как сказал Григорий Боев, пока вы не разукрасите в свой цвет, будет считаться, что там белый.
    Ответ написан
    Комментировать
  • Автоматизация Goal Seek в Google Sheets?

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

    Коротко: это невозможно. Напишите свой GS. Это несложно.
    Ответ написан
    Комментировать
  • Как создать таблицу, чтобы была взаимосвязь цена—кол-во—стоимость?

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

    Класс

    class Recalculator {
      constructor(calcs) {
        this.calcs = calcs;
      }
    
      calc(params, fix) {
        if (params.filter((p) => p === '' || isNaN(p)).length > 1)
          return params.map((p) => (isNaN(p) || p === '' ? '' : Number(p)));
        const index = params.map((p) => (isNaN(p) || p === '' ? '' : Number(p))).findIndex((p) => p === '');
        if (index === -1) return params.map((v, i) => (i === fix ? v : ''));
        const res = this.calcs[index](params);
        const out = [...params];
        out[index] = Number.isInteger(res) ? res : Number(res).toFixed(2);
        return out;
      }
    }


    Применение
    const recalc = new Recalculator([([_, b, c]) => c - b, ([a, _, c]) => c - a, ([a, b, _]) => a + b]);
        const range = sheet.getRange('B3:F3');
        const [a, _, b, __, c] = range.getValues()[0];
        const params = [a, b, c];
    
        const [a1, b1, c1] = recalc.calc(params, fix);
        range.setValues([[a1, _, b1, __, c1]]);


    64b19aeb57f0b767372525.gif

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

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

    64a573d25646e777624052.gif

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

    Пример в Таблице https://docs.google.com/spreadsheets/d/1KTNtoZqQBp...
    Ответ написан
    Комментировать