Ответы пользователя по тегу Google Sheets
  • Как избавиться от Loading?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Apps Script
    Учитель, автоэлектрик, программист, музыкант
    Если данные сконцентрированы в каком-то месте, можно вместо пользовательской функции использовать просто функцию. Только добавить получение из таблицы аргументов, и вывод результата. Обновление можно повесить на открытие таблицы, на onEdit(event) или на триггер по времени, как нравится. Но такой способ менее информативный, на самом деле. Непонятно обновилось оно или нет. Обычно я в конце таких функций(если нет возможности сделать пользовательскую функцию) добавляю тост о том, что всё завершено.
    SpreadsheetApp.getActive().toast("Функция завершена");
    Ответ написан
    Комментировать
  • Как сделать очистку ячеек выбранного диапазона при активации другой?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Apps Script
    Учитель, автоэлектрик, программист, музыкант
    Что значит "активная"? Нет события "активная ячейка" но есть событие "ячейка изменилась" - onEdit(event)
    Вот заготовка кода для этой функции:
    function onEdit(event) {
    	//Возникает при изменении ячейки
    	var ss = 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;							//Старое значение
    	
      if (["Лист1","Лист2"].indexOf(ss.getName())==-1) return;	//Указываем на каких листах должен работать скрипт
    	
    	//Что-то делаем...
      };

    Вместо "Что-то делаем" впишите нужные действия, например, очистку диапазона. Код для очистки можно сделать макрорекордером Инструменты - Макросы - Записать макрос
    1) Запись
    2) Выделить диапазон
    3) Del
    4) Стоп записи
    Или использовать такой код:
    SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Лист1").getRange("A2:B28").clear();

    Но тут есть момент - эта очистка на том же листе может снова спровоцировать onEdit() и надо с этим бороться, проверяя какой диапазон меняется перед тем как что-то очистить
    if (address !="B2") return;
    Ответ написан
    Комментировать
  • Как подтянуть информацию из нескольких листов в один?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    Просто нужно указать ссылку на диапазон и обернуть его в ArrayFormula()
    =ArrayFormula(Лист1!A1:Z100)
    Если данные нужно выводить последовательно (например в первом листе 100 строк, во втором 150 и т.п.) а нужно чтобы шло сплошным массивом, то можно использовать декларацию массива, попутно отсеивая пустые строки (в данном случае - по первому столбцу)
    =Arrayformula(
    {
    filter(Лист1!1:200;Лист1!A1:A200<>"");
    filter(Лист2!1:200;Лист2!A1:A200<>"");
    filter(Лист3!1:200;Лист3!A1:A200<>"")
    }
    )

    Демонстрационная таблица
    Ответ написан
  • Гиперссылка Google Apps Script как IMPORTRANGE?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    Оно и так сохраняется
    Демо-документ
    Ответ написан
    Комментировать
  • ImportXML многостраничного списка?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    Там страницы вида "spravkaby.com/phones/mts/page N"
    ={
    IMPORTXML("http://spravkaby.com/phones/mts/page/1";"//div[1]/p");
    IMPORTXML("http://spravkaby.com/phones/mts/page/2";"//div[1]/p");
    IMPORTXML("http://spravkaby.com/phones/mts/page/3";"//div[1]/p")
    }

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

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Apps Script
    Учитель, автоэлектрик, программист, музыкант
    Смотрите в сторону onEdit(event) - событие изменения ячеек. Вот заготовка кода:
    function onEdit(event) {
    	//Возникает при изменении ячейки
    	var ss = 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;        //Старое значение
    	
      if (["Лист1","Лист2"].indexOf(ss.getName())==-1) return;	//Указываем на каких листах должен работать скрипт
    	
    	//Что-то делаем...
      };

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

    ProgrammerForever
    @ProgrammerForever Куратор тега Excel
    Учитель, автоэлектрик, программист, музыкант
    Если религия позволяет использовать скрипты, то вот такое будет работать:
    /**
     * Возвращает true, если value содержится в inData как ключ с разделителем delimiter
     *
     * @param {A:A} inData Исходный массив или одиночная строка
     * @param {"key"} value Значение, которое ищется среди слов
     * @param {1} delimiter Разделитель слов. По умолчанию - ","
     * @return Возвращает true, если inData - одиночное значение или аналогичный массив, если inData - диапазон
     * @customfunction
     */
    function isContainText(inData,value,delimiter) {
      var delimiter = delimiter || ",";
      if (inData.map){
        return inData.map(function(el){return isContainText(el,value,delimiter)});
      }else{
        var data = inData.split(delimiter);
        if (!data) return false;
        return data.indexOf(value)!=-1;
      };
    }

    Использование:
    =isContainText(A:A;"Ключ";",")
    Ответ написан
    Комментировать
  • Как найти значение второго элемента при IFS?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    Формат - Условное форматирование
    Применить к диапазону
    $B$1:$B$9
    Правила форматирования
    =СЧЁТЕСЛИ($B$1:$B$9;ИСТИНА)>2
    И красную заливку

    Это позволит отслеживать количество галок. Можно даже несколько раз поставить условное форматирование с разным цветом для разных чисел (или использовать градиент)

    Или другой костыль, который даст поставить галку, но не учтёт её, если до этого есть 2 или более установленных
    D1:F9
    ИСТИНА	=СЧЁТЗ(filter($D$1:$D1;$D$1:$D1=ИСТИНА))<=2	=И(D1;E1)
    ЛОЖЬ	=СЧЁТЗ(filter($D$1:$D2;$D$1:$D2=ИСТИНА))<=2	=И(D2;E2)
    ИСТИНА	=СЧЁТЗ(filter($D$1:$D3;$D$1:$D3=ИСТИНА))<=2	=И(D3;E3)
    ЛОЖЬ	=СЧЁТЗ(filter($D$1:$D4;$D$1:$D4=ИСТИНА))<=2	=И(D4;E4)
    ИСТИНА	=СЧЁТЗ(filter($D$1:$D5;$D$1:$D5=ИСТИНА))<=2	=И(D5;E5)
    ИСТИНА	=СЧЁТЗ(filter($D$1:$D6;$D$1:$D6=ИСТИНА))<=2	=И(D6;E6)
    ИСТИНА	=СЧЁТЗ(filter($D$1:$D7;$D$1:$D7=ИСТИНА))<=2	=И(D7;E7)
    ИСТИНА	=СЧЁТЗ(filter($D$1:$D8;$D$1:$D8=ИСТИНА))<=2	=И(D8;E8)
    ИСТИНА	=СЧЁТЗ(filter($D$1:$D9;$D$1:$D9=ИСТИНА))<=2	=И(D9;E9)


    Третий вариант - отслеживать событие onEdit(event) и разруливать всё скриптом
    Ответ написан
    Комментировать
  • Как разрешить группировку ячеек, которые находятся в общем доступе?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    Сделайте доступ не только на просмотр, но и на редактирование. Это поможет.
    Ответ написан
  • Для Google таблиц есть формула с Arrayformula. Как она работает?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант

    =СУММЕСЛИ(СТРОКА(A1); "<="&СТРОКА(A1); A1:A10)
    =СУММЕСЛИ(СТРОКА(A2); "<="&СТРОКА(A2); A1:A10)
    =СУММЕСЛИ(СТРОКА(A3); "<="&СТРОКА(A3); A1:A10)

    и т.д., результат совершенно неадекватный???

    Тут скорее всего разворачивается так:
    =СУММЕСЛИ(СТРОКА(A1); "<="&СТРОКА(A1:A10); A1:A10) => сумма всех {A1:A10} в строках которых {1} меньшие или равны {СТРОКА(A1:A10)}
    =СУММЕСЛИ(СТРОКА(A2); "<="&СТРОКА(A1:A10); A1:A10) => сумма всех {A1:A10} в строках которых {2} меньшие или равны {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
    =СУММЕСЛИ(СТРОКА(A3); "<="&СТРОКА(A1:A10); A1:A10) => сумма всех {10, 20, 30, 40 ...} в строках которых {3} меньшие или равны {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
    ...
    Ответ написан
    Комментировать
  • Как произвести разграничение доступа в гугл таблицах?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    Если данные только на просмотр - можно опубликовать лист как документ, притом редактировать будет нельзя, и доступа к остальным частям документа не будет.
    Файл - Публикация в интренете
    Ответ написан
    Комментировать
  • Как в Spreadsheet использовать название вкладки из ячейки в формуле?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    Формируйте адрес ячейки через СЦЕПИТЬ или & и скармливайте это функции ДВССЫЛ()
    =ДВССЫЛ("Лист1!"&"A1")
    Ответ написан
    1 комментарий
  • Как очистить аркуш через google app script только оставить рядок 1:1?

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

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    Используйте function onEdit(event) для определения факта изменения ячейки.
    event.source.getActiveRange().getA1Notation() для определения адреса ячейки
    Ниже код для проверки листа "Лист1" и ячейки "A1" в ней.
    function onEdit(event){  
      var as = event.source.getActiveSheet();
      if ((event.source.getActiveRange().getA1Notation()=="A1")&&(as.getName()=="Лист1")&&(event.source.getActiveRange().getValue()===true)){  
        as.getRange("B1").setValue("Флажок установлен "+formatDateTime(new Date()));
      };
    };
    
    function formatDateTime(date) {
    
      var dd = date.getDate();
      if (dd < 10) dd = '0' + dd;
      var mm = date.getMonth() + 1;
      if (mm < 10) mm = '0' + mm;
      var yy = date.getFullYear() % 100;
      if (yy < 10) yy = '0' + yy;
      
      var hh = date.getHours();
      if (hh < 10) hh = '0' + hh;
      var MM = date.getMinutes();
      if (MM < 10) MM = '0' + MM;
      var ss = date.getSeconds();
      if (ss < 10) ss = '0' + ss;
      
      return dd + '.' + mm + '.' + yy + ' ' + hh + ':'+ MM + ':'+ ss;
    }
    Ответ написан
    1 комментарий
  • Как дать ссылку на Google Sheets c флажками, защищенными от редактирования?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    Можно извратиться и добавить обработчик onEdit(), где ставить защиту на флажки и запоминать пользователей отдельно. Но это будет сложно и ненадежно. Гугл формы действительно будут лучшим решением.
    Ответ написан
    Комментировать
  • Как сделать так, чтобы автор гугл-документа не узнал о факте его просмотра мною?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    Импортировать его в другой документ, и там уже смотреть.

    IMPORTRANGE(ключ_таблицы; диапазон)

    ключ_таблицы – URL таблицы, из которой импортируются данные.
    Значение параметра ключ_таблицы должно быть текстом, заключенным в кавычки, или ссылкой на ячейку, содержащую необходимую информацию.

    диапазон – строка в формате "[название_листа!]диапазон" (например, "Лист1!A2:B6" или "A2:B6"). Параметр определяет диапазон, который нужно импортировать.
    Компонент название_листа в параметре диапазон не является обязательным. По умолчанию IMPORTRANGE импортирует данные из заданного диапазона первого листа.

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

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    Можно так:
    =REGEXEXTRACT(A1;"[\d.]+")
    Вот на этом сайте удобно проверять регулярки.
    Ответ написан
    Комментировать
  • Есть ли возможность установки автоматической блокировки листа/ячейки в Google Таблицах?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    Написать функцию и задать ей триггер по времени:
    var spreadsheet = SpreadsheetApp.getActive();
      var protection = spreadsheet.getRange('C3:D5').protect();
      protection.setDescription('Описание');
    Ответ написан
  • Создание новой строки при смене статуса в гугл таблице?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    Я уже рассказывал как сделать нечто подобное. Вам нужно примерно то же самое.
    Ссылка
    Ответ написан
    4 комментария
  • Подсчет по нескольким условиям?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    Так, например:
    =СЧЁТЕСЛИ(FILTER(D:D;D:D="Поставщик1";ДАТАЗНАЧ(E:E)>=ДАТАЗНАЧ("01.06.2019");ДАТАЗНАЧ(E:E)<ДАТАЗНАЧ("01.07.2019"));"<>")

    D - Наименование поставщика
    E - Дата
    Ответ написан