Я люблю низкоточное прототипирование. Он должен был быть женихом на моей свадьбе, я так его люблю. Однако у него есть ограничения.
В Airspace Technologies мы направляем важные грузы по всему миру, и от того, насколько быстро мы сможем рассчитать стоимость, зависит, успеет ли орган на пути к операции вовремя. Наш алгоритм цитирования очень сложен, и когда мы его разрабатывали, спецификация была слишком сложной для подписания заинтересованными сторонами, а макеты не отображали все случаи.
Мы обратились к консультационному инструменту номер один на планете: электронным таблицам. Все их понимают, и они могут легко моделировать сложные финансовые показатели. Теперь у нас есть общий язык, понятный бизнесу и инженерам. Мы можем повторять функции цитирования в электронной таблице, поэтому нам не нужно выполнять какие-либо итерации с высокой точностью в коде. Гениально, да?
Ну, проблема в том, что функция Excel плохо транслируется в код приложения. Оцените прекрасную функцию только в E10. Ниже показана только одна ячейка из десятков, которую разработчику приходится реконструировать, пока он не поймет, что делает лист.
Никогда не давайте разработчику электронную таблицу (особенно такую) и не просите превратить ее в код приложения. Не потому, что они не могут, а потому, что это беззастенчиво лениво и замедляет весь процесс разработки до минимума.
Если бы только существовала электронная таблица, которую можно было бы дополнить современным языком программирования…
Войдите в Google Таблицы. Таблицы Google поставляются с Google Scripts и позволяют вам писать JavaScript для взаимодействия с вашими данными. Наблюдать:
Создайте Google Sheet и откройте редактор скриптов.
Добавьте приведенный ниже код.
var SHEET = SpreadsheetApp.getActiveSheet(); function toArray(){ var arr = SHEET.getRange("A1:D1").getValues()[0]; Logger.log(arr); }
Все идет нормально. SHEET — это константа, которую мы можем использовать для взаимодействия с объектом листа. Функция демонстрирует, как считывать данные из диапазона в массив, а затем регистрировать эти данные. Вы можете видеть, что по умолчанию getValues() возвращает многомерный массив, поэтому мы получаем первый массив внутри него, поскольку у нас есть только одна строка данных.
Теперь введите некоторые данные в первую строку вашего листа вот так.
И запустите свою функцию так.
Нажмите Command Enter, и вы увидите, что эти ячейки были считаны в красивую структуру данных, которой вы можете манипулировать в JavaScript!
Давайте на секунду задумаемся о том, насколько это круто. Теперь вы можете создать простую форму, которую легко преобразовать в интерфейс, и повторять функции JavaScript до тех пор, пока у вас не будет полностью проработанной системы цитирования (или чего-то еще).
Давайте сделаем еще один шаг и сделаем что-нибудь полезное. Мы рассчитываем расстояние в пути как часть нашего алгоритма ценообразования. Как мы можем сделать это в электронной таблице? Что ж, удачи в Excel, но с Google Sheets вы можете просто вызывать некоторые причудливые функции из Google и передавать данные из вашего листа в качестве параметров. Давай сделаем это. Добавьте на лист два адреса.
Получение данных из вашего листа
Теперь в вашем скрипте давайте добавим несколько функций.
// ========== Sheet setup ========== var SHEET = SpreadsheetApp.getActiveSheet(); // ========== Getters ========== function fromAddress(){ return SHEET.getRange("B2").getCell(1, 1).getValue(); } function toAddress(){ return SHEET.getRange("B3").getCell(1, 1).getValue(); }
В разделе настройки листа мы настраиваем наш объект листа, чтобы мы могли получать и устанавливать данные. Ниже находятся две функции получения, которые позволяют нам легко получать данные из этой ячейки. Теперь давайте получим некоторые расстояния!
Получение данных из Google API
function driveDistance(fromAddress, toAddress) { var directions = Maps.newDirectionFinder() .setOrigin(fromAddress).setDestination(toAddress) .setMode(Maps.DirectionFinder.Mode.DRIVING) .getDirections(); var d = directions.routes[0].legs[0].distance.text; return parseInt(d.split(" ")[0].replace(",", ""));; }
Наша функция driveDistance принимает два адреса, вызывает карты Google и просто возвращает пробег. Насколько это было легко?
Настройка данных на вашем листе
Теперь давайте визуализируем его в ячейку нашего листа. Вы можете сделать это двумя способами.
- Вы можете просто ввести лист в значение ячейки.
- Вы можете запустить функцию автоматически, нажав на триггер.
Редактирование значения ячейки:
В функции редактирования:
function onEdit(e){ SHEET.getRange("B5").getCell(1,1).setValue(driveDistance(fromAddress(), toAddress())); }
Функция onEdit — это триггер, который будет запускаться каждый раз, когда лист хорошо… редактируется. Один из советов: вы не можете вызывать какую-либо функцию, которая находится за пределами экосистемы Google. Вы можете узнать больше об ограничениях на триггеры и о том, какие другие триггеры доступны здесь: https://developers.google.com/apps-script/guides/triggers/
Вы сделали! Теперь у вас должно быть расстояние в ячейке по вашему выбору (в данном случае B5), и вы можете продолжать делать удивительные вещи!
Спасибо https://ctrlq.org/code/19735-find-distance-in-google-sheets за удобную функцию расстояния.