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

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Apps Script
    Учитель, автоэлектрик, программист, музыкант
    .makeCopy()
    В этом месте и создаётся файл.

    Чтобы он не создавался, добавьте проверку на существование. Что-то вроде:
    let fileName = 'Заявка № ' + number;
    if (!DriveApp.getFilesByName(fileName ).hasNext()){
      return;
    };
    Ответ написан
    Комментировать
  • Как программно написать триггер, который будет запускать макрос, при условии редактирования определенной ячейки на определенном листе?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Apps Script
    Учитель, автоэлектрик, программист, музыкант
    Только я раз 10 этот код скидывал здесь.
    /**
     * Возникает при изменении ячейки
    * @param {e} event event-объект https://developers.google.com/apps-script/guides/triggers/events?hl=ru
     * [ ProgrammerForever (c) 2020 ]
     * @return Не возвращает значений
     */
    function onEdit(event) {
      var sheet = event.source.getActiveSheet();//Текущий лист
      var address = event.range.getA1Notation().toUpperCase();//Адрес ячейки
      var row = event.range.getRow();      //Номер строки
      var col = event.range.getColumn();  //Номер столбца
      var newValue = event.value;            //Новое значение
      var oldValue = event.oldValue;        //Старое значение
      var userEmail = event.user.getEmail();//Пользователь(работает только при вручную назначенном триггере)
      
      if((col===1)&&(row===1)&&(sheet.getName==="Sheet1")){
        // Что-то делаем
      };
    };
    Ответ написан
    Комментировать
  • Как избежать дублей сообщений при отправке сообщений через Телеграм бота?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Apps Script
    Учитель, автоэлектрик, программист, музыкант
    Обычно проблема что onEdit не каждый раз срабатывает и события пропускаются, а тут наоборот.
    По факту каждое редактирование генерирует onEdit событие. Если надо отправлять реже - определитесь по какому параметру фильтровать эти события - по данным, по времени или еще как-то.
    1) Сделать очередь на отправку, отправлять пачкой по достижении какого-то количества
    2) Или запускать раз в минуту отправку
    3) Или блокировать документ на время отправки, если возникает гонка
    Или любая другая логика, сейчас непонятна проблема.
    Ответ написан
    Комментировать
  • Почему выдает ошибку Service Spreadsheets failed while accessing document with id sheet_id?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Apps Script
    Учитель, автоэлектрик, программист, музыкант
    1) Вынесете лист с которым работаете в отдельную переменную вне цикла, нет необходимости получать её каждый раз.
    2) Зачем нужен массив abc? item никак не используется.
    3) Сделайте задержку или SpreadsheetApp.Flush(). Скорее всего не успевает скрипт.
    4) Объединённые ячейки - зло и грабли.
    Ответ написан
    Комментировать
  • Как настроить проставление даты при изменении соседней ячейки в Google Sheets?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Apps Script
    Учитель, автоэлектрик, программист, музыкант
    Чтобы дата не менялась, нужно копировать данные скриптом и фиксировать дату копирования.
    1) Получить все данные из источника
    2) Убрать все строки (по какому-то ключевому столбцу) которые уже есть в приёмнике
    3) Добавить дату копирования в каждую из оставшихся после фильтра строк
    4) Добавить эти данные в приёмнике
    Ответ написан
  • Почему не проходит отладку google apps script?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Apps Script
    Учитель, автоэлектрик, программист, музыкант
    let ss = SpreadsheetApp.getActiveSpreadsheet();
    let sheet = ss.getSheetByName("Маршрут");
    let data = sheet.getDataRange().getValues();
    Ответ написан
    Комментировать
  • Почему не удается получить данные методом video.get у некоторых ссылок?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Apps Script
    Учитель, автоэлектрик, программист, музыкант
    1) Попробуйте открывать не в браузере, а в постмане; там более чистый запрос - нет кук, можно контролировать заголовки, юзер-агент, реферер и т.п.
    2) Если приходит ответ вида:
    {"response":{"count":0,"items":[]}}
    то, скорее всего, и с токеном и со всем остальным всё ок - что-то не то с данными запроса или с самим ресурсом, который запрашивается. Это 200 ответ, а не ошибка.
    3) Как вариант для проверки - сервис может не отдавать данные по некоторым ip адресам. Предсказать какой будет ip у скрипта невозможно.
    4) Попробуйте сохранить и переиспользовать куки, внедрить в headers нужные заголовки, которые браузер передаёт и т.п.
    5) Перезалейте второе видео, возможно всё-таки есть что-то, что запрещает получать данные по API.
    Ответ написан
    Комментировать
  • Как сделать секундомер с пуском и паузой?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Apps Script
    Учитель, автоэлектрик, программист, музыкант
    Для каждого ввести статусы - выключено, запущено; т.е. нужна простая машина состояний.
    Кнопки меняют статусы и пишут данные. Вместо кнопок можно onEdit+галка.
    Триггер по времени (раз в минуту) обновляет данные.

    Если нужно готовое решение - можно посмотреть в сторону фриланса
    Ответ написан
    Комментировать
  • Как с помощью макроса найти слова и выделить их разными цветама в зависиомости от слова в гугл таблицах?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Apps Script
    Учитель, автоэлектрик, программист, музыкант
    Храните слова и цвета вместе, и используйте вместе.
    let dictionary = {
      stop_words: [
       { word: "Not_Malicious", color_code: "#ea4300" },
       { word: "NOT_Virus", color_code: "#ea0035" },
       { word: "NOT_Fake_Message", color_code: "#004335" },
       { word: "NOT_Misleading", color_code: "#ea4005" },
       { word: "NOT_Sound", color_code: "#e00335" },
       { word: "NOT_JSalert", color_code: "#0a0305" },
      ],
    };
    
    // Тут, для производительности, можно предварительно сделать все TextStyle вместо color_code
    
    function _1() {
      let sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
      // range диапазон поиска
      let range = sheet.getRange("E:E").getValues();
    
      range.forEach((item, row) => {
        for (let column = 0; column < item.length; column++) {
          if (typeof item[column] === "string" && item[column] != "") {
            let richText = SpreadsheetApp.newRichTextValue().setText(item[column]);
            // item[column] текст ячейки
            dictionary.stop_words.forEach(({word, color_code}) => {
              let arr = searchIndex(
                word.toLocaleLowerCase(),
                item[column].toLocaleLowerCase()
              );
              let color = SpreadsheetApp.newTextStyle()
              .setForegroundColor(color_code)
              .build();
              arr.forEach((ind) => {
                richText.setTextStyle(ind.startIndex, ind.endIndex, color);
              });
              sheet
                .getRange(row + 1, column + 1)
                .setRichTextValue(richText.build());
            });
          }
        }
      });
    }
    // ... остальной код
    Ответ написан
    Комментировать
  • Почему не работает тригер гугл таблиц?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Apps Script
    Учитель, автоэлектрик, программист, музыкант
    Тут в самом вопросе ответ:
    через бота >> не работает
    через apps scripts >> не работает
    вручную >> работает

    Если надо запустить функцию извне, используйте doGet/doPost
    Ответ написан
    Комментировать
  • Какой Скрип для записи последних действий в документе можно использовать?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Apps Script
    Учитель, автоэлектрик, программист, музыкант
    /**
     * Возникает при изменении ячейки
    * @param {e} event event-объект https://developers.google.com/apps-script/guides/triggers/events?hl=ru
     * [ ProgrammerForever (c) 2020 ]
     * @return Не возвращает значений
     */
    function onEdit(event) {
      var as = event.source.getActiveSheet();//Текущий лист
      var address = event.range.getA1Notation().toUpperCase();//Адрес ячейки
      var row = event.range.getRow();      //Номер строки
      var col = event.range.getColumn();  //Номер столбца
      var newValue = event.value;            //Новое значение
      var oldValue = event.oldValue;        //Старое значение
      var userEmail = event.user.getEmail();//Пользователь(работает только при вручную назначенном триггере)
      
      let archiveSheetName = "sheet";
      let ss = SpreadsheetApp.getActiveSpreadsheet();
      let archiveSheet = ss.getSheetByName(archiveSheetName) || ss.insertSheet(archiveSheetName);
      archiveSheet.appendRow([new Date(), userEmail, as.getName(), address, oldValue, newValue]);
    };
    Ответ написан
  • Как сделать так, чтобы окрывался функционал в копии только после активации?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Apps Script
    Учитель, автоэлектрик, программист, музыкант
    Если коротко: никак. Если юзер может редактировать таблицу, то может и смотреть скрипты и прочее.

    Я делал свой бэкенд (на тех же гугл скриптах) с доступом по токену. Без него таблица хоть и не пустышка, но мало применима.
    Ответ написан
  • Как сделать тег определенной роли в Discord в зависимости от выбора варианта в форме?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Apps Script
    Учитель, автоэлектрик, программист, музыкант
    У вас же есть код который обрабатывает событие отправки формы? Вот там и реализуйте всю бизнес-логику, никаких подводных камней нет, пару if всего-то
    Ответ написан
  • Как сделать скрипт для сверки данных?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Apps Script
    Учитель, автоэлектрик, программист, музыкант
    =arrayformula(if(a2:a="";;ЕСЛИОШИБКА(ВПР(a2:a;лист1!a:b;2;0))))

    a2:a = мак2
    лист1!a:b = мак1+владелец
    Ответ написан
    Комментировать
  • Как проверить данные в массиве и применить действие к нужным строкам?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Apps Script
    Учитель, автоэлектрик, программист, музыкант
    Примерно так:
    let range = SpreadsheetApp.getActiveSpreadsheet().getSheetByName().getDataRange();
    let values = range.getValues();
    
    const formatDate = (date) => Utilities.formatDate(date, "GMT+3", "dd.MM.yyyy");
    let now = formatDate(new Date());
    
    let newValues = values.map(row=>{
      let [date, ...rest] = row;
      let formattedDate = formatDate(date);
      return now===formattedDate?[now, ...rest]:row;
    });
    
    range.setValues(newValues);
    Ответ написан
    Комментировать
  • Как открыть почтовый клиент через макрос?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Apps Script
    Учитель, автоэлектрик, программист, музыкант
    Открыть html окно всплывающее, у него больше прав/возможностей, там обычный html+js. Останется только загуглить как открыть стандартную почтовую программу на JS. Можно по загрузке документа сделать тег , найти его по id, и сделать .click() по нему. Я бы с этого начал.
    PS: что-то подобное я делал, и делал именно так.
    Ответ написан
    Комментировать
  • Вебхук через гугл таблицу, как отправить изображения в дискорд?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Apps Script
    Учитель, автоэлектрик, программист, музыкант
    Если можно отправлять хоть чем-то, то наверняка можно это отправить и гугл таблицей.
    Не знаю деталей API, если там blob отправляется, то надо получать файл, делать blob, упаковывать в запрос и отправлять по API в дискорд. Если ссылка - то то же самое, только надо как-то получить ссылку на изображение, возможно через Drive API.
    Ответ написан
    Комментировать
  • Почему скрипт сохраняет в корневую папку?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Apps Script
    Учитель, автоэлектрик, программист, музыкант
  • Почему не работает условие IF?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Apps Script
    Учитель, автоэлектрик, программист, музыкант
    .getValues() даёт не одномерный массив, а массив массивов, даже если это одна ячейка.
    [
      ["A1", "B1", "C1"],
      ["A2", "B2", "C2"],
      ["A3", "B3", "C3"]
    ]

    Попробуйте сравнить id_rassulka_zakaza[i][0] и id_zakaz_zakaza[z][0].
    Ответ написан
    1 комментарий
  • Почему при сортировке удаляются формулы?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Apps Script
    Учитель, автоэлектрик, программист, музыкант
    А может быть по-другому?
    range.setValues(newData); // Тут затираются формулы

    Вообще, если не идёт речи о супероптимизации огромных массивов, то можно воспользоваться встроенным сортировщиком.
    Пример из справки:
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = ss.getSheets()[0];
    var range = sheet.getRange("A1:C7");
    
    // Sorts by the values in the first column (A)
    range.sort(1);
    
    // Sorts by the values in the second column (B)
    range.sort(2);
    
    // Sorts descending by column B
    range.sort({column: 2, ascending: false});
    
    // Sorts descending by column B, then ascending by column A
    // Note the use of an array
    range.sort([{column: 2, ascending: false}, {column: 1, ascending: true}]);
    Ответ написан
    3 комментария