Ответы пользователя по тегу Google Apps Script
  • Как импортировать данные из текстового файла, который ежедневно сохраняется на Диск Гугл?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Apps Script
    Учитель, автоэлектрик, программист, музыкант
    Сделайте функцию, повесьте её на триггер по времени (ежедневный). В функции:
    1) Открыть итератор файлов с определенным именем
    var fileIterator = DriveApp.getFilesByName(fileName);

    2) Получить содержимое файла(ов):
    while(fileIterator.hasNext()){
      var textFromFile = fileIterator.next().getAs(ContentService.MimeType.TEXT);
    };

    3) Записать данные куда нужно
    SpreadsheetApp.getActiveSpreadsheet().getSheetByName(name).getRange(row, column).setValue(textFromFile );
    Ответ написан
    Комментировать
  • Как использовать один проект Apps Script для 2х и более Таблиц?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Apps Script
    Учитель, автоэлектрик, программист, музыкант
    Вместо обычного
    var ss = SpreadsheetApp.getActiveSpreadsheet();  //Текущая таблица

    используйте один из вариантов
    var ss = SpreadsheetApp.openById(id); //открытие сторонней таблицы по id
    //или
    var ss = SpreadsheetApp.openByUrl(url);//открытие сторонней таблицы по url

    И потом работайте с ss как с обычной таблицей
    Ответ написан
    1 комментарий
  • Как сделать автозаполнение скриптом?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Apps Script
    Учитель, автоэлектрик, программист, музыкант
    Многое можно сделать чисто формулами. Вот пример - если что-то есть в столбце A, то получается сумма (A + B). Запишите это в C1 и добавьте в A и B значения.
    =arrayFormula(
      еслиошибка(
         если(a:a<>""; a:a+b:b; "")
      )
    )


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

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Apps Script
    Учитель, автоэлектрик, программист, музыкант
    Можно получить список всех листов и проходить в цикле. Данные копировать так же, но при вставке менять номер строки (тут 2 заменить на (последнюю строку данных на листе + 1))
    .getRange(2, 1, FromData.length, FromData[0].length)

    Если хочется чтобы работало быстрее - то нужно формировать двумерный массив данных из всех, и потом за раз писать в ячейки. Просто при получении новой порции данных добавляйте построчно их в общий двумерный массив.
    Ещё проще - использовать IMPORTRANGE() - там само всё подтягивается с другой таблицы. Если надо писать в столбец, можно использовать декларацию массива:
    ={1;2;3}
    ... выведет 1,2,3 в столбик. Замените цифры формулами с IMPORTRANGE() по количеству листов и получите автоматически то что хотите. Единственное НО - данные такие - только на чтение
    Ответ написан
  • Как запустить скрипт в скрипте?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Apps Script
    Учитель, автоэлектрик, программист, музыкант
    Просто вызывайте одну функцию из другой, даже если они в разных gs файлах
    //Code1.gs
    function f1(){
       return f2()+100;
    };
    
    
    //Code2.gs
    function f2(){
       return 200;
    };
    Ответ написан
    Комментировать
  • Как дописать скрипт Google Apps script?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Apps Script
    Учитель, автоэлектрик, программист, музыкант
    Получать данные по одной ячейке - это ооооооочень долго. Лучше взять все данные сразу в нужном диапазоне, например так:
    var data = ss.getActiveSheet().getRange("A3:A1000").getValues();

    И потом можно обращаться к этим данным по номеру строки и номеру столбца, не забывая что отсчёт идёт с нуля:
    data[row][column]
    Записывать тоже нужно массово. В итоге получится что-то такое:
    function onOpen() { 
      //Выполняется при открытии
      SpreadsheetApp
      .getUi()
      .createMenu('Меню')
      .addItem('Выполнить','doIt')
      .addToUi();
    };
    
    function doIt() {
      try{
        var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); //Текущий лист
        
        var data1 = ss.getRange("A3:E" + ss.getMaxRows()).getValues();
        var data2 = ss
        .getRange("m4:n" + ss.getMaxRows())
        .getValues()
        .filter(function(row) // Убираем пустые строки
                {
                  return row[0]!="";
                }
               );
        
        for (var row2=0;row2<data2.length;row2++){
          for (var row1=0;row1<data1.length;row1++){
            if (data1[row1][0]===data2[row2][0]){
              data1[row1][4]+=data2[row2][1];
              break; //Если значение найдено, дальше не ищем
            };
          };
        };
        
        ss.getRange("A3:E" + ss.getMaxRows()).setValues(data1); //Вывод данных
        SpreadsheetApp.getActive().toast("Готово!");
      }catch(e){ //Если вдруг ошибка
        Logger.log("Ошибка! " + e);
      };
    }

    Демо-таблица
    Ответ написан
    6 комментариев
  • Как избавиться от 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 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 Куратор тега Google Apps Script
    Учитель, автоэлектрик, программист, музыкант

    функция возвращает сумму значений слева и справа от той ячейки, на которой вызвана

    =ДВССЫЛ("R"&СТРОКА()&"C"&(СТОЛБЕЦ()-1);ЛОЖЬ) + ДВССЫЛ("R"&СТРОКА()&"C"&(СТОЛБЕЦ()+1);ЛОЖЬ)
    Ответ написан
    3 комментария
  • Как сделать диапазон свободных дат в ответе гугл форм?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Apps Script
    Учитель, автоэлектрик, программист, музыкант
    Используйте проверку данных в ячейке выбора даты/времени. Список формируйте из тех что есть минус те, что заняты. Обновление проверки данных можно повесить на onEdit(event). И ещё будет пара служебных столбцов - все слоты и свободные слоты.
    Ответ написан
  • Как очистить аркуш через google app script только оставить рядок 1:1?

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

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

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Apps Script
    Учитель, автоэлектрик, программист, музыкант
    Инструменты - Макрос - Записать макрос. После записи действий - можно назначить хоткей. И подправить макрос на:
    function myFunction() {
      SpreadsheetApp.getActive().getActiveRange().activate().merge();
    };

    Этот макрос объединяет выделенный в данный момент диапазон
    Ответ написан
    5 комментариев
  • Как вставить строку с числом в Таблицу через API без форматирования?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Apps Script
    Учитель, автоэлектрик, программист, музыкант
    Попробуйте вставить как строку, например так
    (val+"")
    Ответ написан
    Комментировать