Путаница с массивами - PullRequest
       100

Путаница с массивами

1 голос
/ 29 мая 2020

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

В настоящее время у меня есть электронная таблица Google который заполнен почтовыми индексами Великобритании, эти почтовые индексы автоматически добавляются в различных точках с использованием комбинации форм Google и Microsoft forms / flow.

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

Например, в столбце C будет указан почтовый индекс самовывоза, а в столбце D будет почтовый индекс возврата - в столбце Я хотел бы, чтобы пробег автоматически отображался при добавлении новой строки с новыми почтовыми кодами.

В настоящее время я использую указанную ниже функцию клиента для расчета расстояния в милях, но мне нужно иметь возможность обернуть ее в функции ARRAYFORMULA в таблицах Google, но когда я делаю это, только первая ячейка отображает правильный пробег (остальные остаются пустыми)

* 1 013 * Кажется, что приведенный ниже код работает очень хорошо. Я просто не могу понять, как разрешить функции GOOGLEDISTANCE принимать массив почтовых индексов Pick up и массив почтовых индексов возврата, а затем возвращать массив рассчитанного пробега в милях.

Код:

function GOOGLEDISTANCE(pick_up,drop_off,return_type) {
      Utilities.sleep(1000);
      var travelMode = Maps.DirectionFinder.Mode.BICYCLING;  
      var directions = Maps.newDirectionFinder()
      .setRegion('UK')
      .setLanguage('en-GB')
      .setOrigin(pick_up)
      .setDestination(drop_off)
      // .addWaypoint(waypoint1)
      .setMode(travelMode)
      .getDirections();

      if (directions.status !== "OK") 
      return "Error: " + directions.status;

     var route = directions.routes[0].legs[0];
     var time = route.duration.value;
     var distance = route.distance.value;

     var steps = route.steps.map(function(step) {
      return step.html_instructions.replace(/<[^>]+>/g, "");
     }).join("\n");

     switch(return_type) {
      case "MILES":
      case "miles":
      return distance * 0.000621371;
      break;
      case "KILOMETERS":
      case "kilometers":
      return distance / 1000;
      break;
      case "MINUTES":
      case "minutes":
      return time / 60;
      break;
      case "HOURS":
      case "hours":
      return time / 60 / 60;
      break;
      case "STEPS":
      case "steps":
      return steps;
      break;
      default:
      // Default to miles
     return distance * 0.000621371;
    }
}

1 Ответ

1 голос
/ 29 мая 2020

Согласно документам он должен иметь структуру, аналогичную приведенному ниже коду.

=arrayFormula(GOOGLEDISTANCE_WRAPPER())

function GOOGLEDISTANCE_WRAPPER(data) {
  if(Array.isArray(data)) {
    return data.map(GOOGLEDISTANCE)
  }

  return GOOGLEDISTANCE(data);
}

function GOOGLEDISTANCE(pick_up, drop_off, return_type) {
  ...code...
}

...