Мое знакомство с Google Apps Script началось с таблиц. Надоело возиться с важными для работы файлами: носить с собой на флешке, копировать, синхронизировать... Спустя некоторое время после загрузки нескольких таблиц в формате Excel на Google Drive (тогда сервис назывался Google Docs), возникла необходимость кастомизировать один из документов. Первым делом я вспомнил старый добрый VBA, но возвращаться из облака уже не хотелось. Так мы и познакомились...
В настоящей статье я хочу предложить вниманию уважаемой публики варианты кастомизации табличного документа на примере списка IP-адресов.
Как вы уже наверняка догадались, для работы нам понадобится аккаунт Google. В случае наличия последнего, вы можете открыть шаблон таблицы, копировать (Файл - Создать копию) и в процессе освоения материала использовать свой экземпляр, уже содержащий исходный код.
Начнем с прелюдии. Отрываем копию шаблона документа (или создаем новый) и переходим в Редактор скриптов (Инструменты - Редактор скриптов).
Заполняем первый лист таблицы списком IP-адресов подсети 192.168.1.0/24:
Сформулируем задачу: отобразить информацию о свободных и используемых IP-адресах.
Первое что приходит в голову - использовать фильтр. Подходящее решение, но, как показывает практика, максимум на что может сподобиться пользователь - нажать на кнопку и/или выбрать пункт меню. В Excel я бы накидал несколько объектов на графический слой и привязал бы к ним VBA-функции. Здесь такой фокус не прокатит, придется добавлять кастомное меню. Впрочем, добавляется оно очень просто, но обо все по-порядку.
Предлагаю три варианта отображения информации:
- в отдельном столбце
- путем скрытия/отображения строк листа
- во всплывающем окне
1. Для отображения информации в отдельном столбце используем функцию фильтрации FILTER:
2. Для отображения информации путем скрытия/отображения строк используем методы листа hideRows/unhideRow соответственно:
Как вы уже наверняка догадались, для работы нам понадобится аккаунт Google. В случае наличия последнего, вы можете открыть шаблон таблицы, копировать (Файл - Создать копию) и в процессе освоения материала использовать свой экземпляр, уже содержащий исходный код.
Начнем с прелюдии. Отрываем копию шаблона документа (или создаем новый) и переходим в Редактор скриптов (Инструменты - Редактор скриптов).
Заполняем первый лист таблицы списком IP-адресов подсети 192.168.1.0/24:
// заполняем лист данными function fillCompList() { var arr = [['IP','CompName']]; for (var i = 1;i < 255; i++) { var val = []; if (Math.random() > 0.5) val = ['192.168.1.' + i,'Computer-' + i] else val = ['192.168.1.' + i,'']; arr.push(val); } var ss = SpreadsheetApp.getActiveSheet(); ss.clear(); if (ss.getLastRow() > 0) ss.getDataRange().clear(); ss.getRange(1, 1, arr.length, 2).setValues(arr); }После выполнения функции первые два столбца листа заполняются IP-адресами от 192.168.1.1 до 192.168.1.254 и именами компьютеров соответственно.
Сформулируем задачу: отобразить информацию о свободных и используемых IP-адресах.
Первое что приходит в голову - использовать фильтр. Подходящее решение, но, как показывает практика, максимум на что может сподобиться пользователь - нажать на кнопку и/или выбрать пункт меню. В Excel я бы накидал несколько объектов на графический слой и привязал бы к ним VBA-функции. Здесь такой фокус не прокатит, придется добавлять кастомное меню. Впрочем, добавляется оно очень просто, но обо все по-порядку.
Предлагаю три варианта отображения информации:
- в отдельном столбце
- путем скрытия/отображения строк листа
- во всплывающем окне
1. Для отображения информации в отдельном столбце используем функцию фильтрации FILTER:
// отображаем свободные IP-адреса в отдельном столбце function fiterFreeIPList() { var ss = SpreadsheetApp.getActiveSheet(); clearIPList(); var column = ss.getLastColumn() + 1; ss.getRange(1,column).setValue('FreeIP'); var row = ss.getLastRow(); ss.getRange(2, column).setFormula('=filter(A2:A' + row + ';B2:B' + row + '="")'); } // отображаем используемые IP-адреса в отдельном столбце function fiterBusyIPList() { var ss = SpreadsheetApp.getActiveSheet(); clearIPList(); var column = ss.getLastColumn() + 1; ss.getRange(1,column).setValue('BusyIP'); var row = ss.getLastRow(); ss.getRange(2, column).setFormula('=filter(A2:A' + row + ';B2:B' + row + '<>"")'); } // очищаем список IP-адресов function clearIPList() { var ss = SpreadsheetApp.getActiveSheet(); if (ss.getRange(1, 3).getValue() != '') ss.getRange(1, 3, ss.getLastRow()).clear(); }Для тех, кто впервые открыл Редактор скриптов, кратко объясню последовательность разработки: пишем код, выбираем функцию и запускаем (нажимаем на стрелочку - Выполнить), в случае ошибок дебажим (нажимаем на паучка - Отладка).
2. Для отображения информации путем скрытия/отображения строк используем методы листа hideRows/unhideRow соответственно:
// прячем строки с используемыми IP-адресами function hideBusyIPRows() { unhideAllRows() var ss = SpreadsheetApp.getActiveSheet(); var rng = ss.getRange(2, 2, ss.getLastRow()); var values = rng.getValues(); for (var i = 0; i < rng.getNumRows() - 1; i++) { if (values[i][0] != '') ss.hideRows(i+2); } } // прячем строки со свободными IP-адресами function hideFreeIPRows() { unhideAllRows() var ss = SpreadsheetApp.getActiveSheet(); var rng = ss.getRange(2, 2, ss.getLastRow()); var values = rng.getValues(); for (var i = 0; i < rng.getNumRows() - 1; i++) { if (values[i][0] == '') ss.hideRows(i+2); } } // отображаем все строки function unhideAllRows() { var ss = SpreadsheetApp.getActiveSheet(); var rng = ss.getDataRange(); ss.unhideRow(rng); }3. Для отображения информации во всплывающем окне могу предложить три варианта:
// msgBox function msgBoxShow() { Browser.msgBox('Это текст'); //можно добавить заголовок и кнопки } // Label function labelShow() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var app = UiApp.createApplication().setTitle('Это заголовок приложения'); app.add(app.createLabel('Это текст')); ss.show(app); } // Grid function gridShow() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var app = UiApp.createApplication().setTitle('Это заголовок приложения'); app.add(app.createGrid(1,2).setText(0, 0, 'Это текст в первой колонке').setText(0, 1, 'Это текст во второй колонке')); ss.show(app); }Для отображения списка свободных IP-адресов используем Label:
// отображаем свободные IP-адреса во всплывающем окне function showFreeIPList() { var ss = SpreadsheetApp.getActiveSheet(); // получаем массив значений в диапазоне: [[IP, CompName],[IP, CompName]...] var arr = ss.getDataRange().getValues(); var app = UiApp.createApplication().setTitle('Список свободных IP-адресов').setWidth(240).setHeight(300); var vPanel = app.createVerticalPanel(); for (var i = 1; i < arr.length; i++){ if (arr[i][1].toString() == '') vPanel.add(app.createLabel(arr[i][0])); } app.add(app.createScrollPanel(vPanel).setSize(240, 300)); var ssh = SpreadsheetApp.getActiveSpreadsheet(); ssh.show(app); }Для отображения списка используемых IP-адресов используем Grid:
// отображаем используемые IP-адреса во всплывающем окне function showBusyIPList() { var ss = SpreadsheetApp.getActiveSheet(); // получаем массив значений в диапазоне: [[IP, CompName],[IP, CompName]...] var arr = ss.getDataRange().getValues(); var app = UiApp.createApplication().setTitle('Список используемых IP-адресов').setWidth(240).setHeight(300); var j = 1; var grid = app.createGrid(j,2).setCellPadding(2).setText(0, 0, 'IP').setText(0, 1, 'CompName'); for (var i = 1; i < arr.length; i++){ if (arr[i][1].toString() != '') { j += 1; grid.resize(j, 2).setText(j - 1, 0, arr[i][0]).setText(j - 1, 1, arr[i][1]); } } app.add(app.createScrollPanel(grid).setSize(240, 300)); var ssh = SpreadsheetApp.getActiveSpreadsheet(); ssh.show(app); }В завершение создадим меню для всего безобразия, которое мы с вами наваяли:
// закидываем меню function onOpen() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var menu = [ {name: "Обновить данные", functionName: "fillCompList"}, {name: "Свободные IP-адреса в отдельном столбце", functionName: "fiterFreeIPList"}, {name: "Используемые IP-адреса в отдельном столбце", functionName: "fiterBusyIPList"}, {name: "Очистить список IP-адресов", functionName: "clearIPList"}, {name: "Спрятать строки с используемыми IP-адресами", functionName: "hideBusyIPRows"}, {name: "Спрятать строки со свободными IP-адресами", functionName: "hideFreeIPRows"}, {name: "Отобразить все строки", functionName: "unhideAllRows"}, {name: "Свободные IP-адреса во всплывающем окне", functionName: "showFreeIPList"}, {name: "Используемые IP-адреса во всплывающем окне", functionName: "showBusyIPList"} ]; ss.addMenu("Мое меню", menu); }
Исходя из названия функции нетрудно догадаться, что меню залетит на панель сразу после открытия документа.
Таким образом мы изучили несколько приемов кастомизации таблиц в облаке Google. На мой взгляд ничем не хуже VBA. Плюс все сервисы Google к вашим услугам. Мне всегда нравился Microsoft Office, во многом за счет VBA. Но если сравнить облачные сервисы Google и Microsoft, то на текущий момент я ставлю на Google.
Круто! Многое прояснилось. Поражает как легко манипулируешь новыми вещами.
ОтветитьУдалить