Я люблю низкоточное прототипирование. Он должен был быть женихом на моей свадьбе, я так его люблю. Однако у него есть ограничения.

В 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 и просто возвращает пробег. Насколько это было легко?

Настройка данных на вашем листе

Теперь давайте визуализируем его в ячейку нашего листа. Вы можете сделать это двумя способами.

  1. Вы можете просто ввести лист в значение ячейки.
  2. Вы можете запустить функцию автоматически, нажав на триггер.

Редактирование значения ячейки:

В функции редактирования:

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 за удобную функцию расстояния.