Формирование кластеров с использованием предварительно определенных групп в Google-Apps-Script - PullRequest
1 голос
/ 06 ноября 2019

В настоящее время я работаю над созданием матрицы расстояний с использованием Google Apps Script / javascript. На данный момент у меня есть 50 адресов, которые я хотел бы отсортировать по группам на основе их кодов состояния.

Я отфильтровал соответствующие коды штатов (название листа: «Отфильтрованные состояния»). И я отфильтровал адреса, которые соответствуют этим кодам состояния (название листа: «Фильтрованные адреса»).

Теперь моя цель - создать скрипт, который сравнивает список адресов с кодами состояний и сортирует адреса в массивы в зависимости от того, соответствуют ли коды состояний отфильтрованным кодам состояний.

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

function maps(origin, destination) {
  var driving = Maps.DirectionFinder.Mode.DRIVING
  var transit = Maps.DirectionFinder.Mode.TRANSIT
  var modeSet = driving
  var directions = Maps.newDirectionFinder()
  .setOrigin(origin)
  .setDestination(destination)
  .setMode(modeSet)
  .setOptimizeWaypoints(true)
  .getDirections()
  var result = directions
  return result;         

}

function sorting() {
 //get distance
  var outputSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Maps");
  var relstatecodes = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Filtered States");
  //relstatecodes are the filtered states that will form the clusters
  var reladdresses = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Relevant Addresses");
  //reladdresses are the full addresses that match the filtered states
  var lastrow = relstatecodes.getLastRow();
  var lastrow2 = reladdresses.getLastRow()
  var range = relstatecodes.getRange(3,1, lastrow-1,1);   //list starts from row 3
  var range2 = reladdresses.getRange(2,3, lastrow2-1,3); //list starts from row 2 col3
  var statecodes = range.getValues();
  var stateaddresses = range2.getValues()
  var storage = []

  for (var y = 0; y < statecodes.length; y++) //sorting addresses into clusters
  {
    var sort = []
    for (var x = 0; x < stateaddresses.length; x++) //checking if addresses match the filtered state codes
    { if ( x[0] == y[0]) {
      sort.push(x[0])
      storage.push(sort)
    }
    }
  }
 console.log(storage);
}

Ссылка на электронную таблицу, которую я использую: https://docs.google.com/spreadsheets/d/17Y1br0klimT8aAf74oJjo0VnROCt7iHTFP16wvDx1TI/edit?usp=sharing

Я хочу, чтобыиметь массив хранения, в котором размещены все отсортированные адреса. Затем я могу использовать это для дальнейших расчетов расстояния. Я заранее извиняюсь, если что-то из этого вызывает путаницу.

Редактировать: Результаты должны выглядеть следующим образом:

['1000 S Fremont Ave #5, Alhambra, CA 91803, United States',
'4021 Rosewood Ave, Los Angeles, CA 90004, United States' , '919 S Grand Ave, Los Angeles, CA 90015, United States', 
'17335 N Palm Bluffs Ave, Fresno, CA 93711, United States',
'6363 Sunset Blvd, Los Angeles, CA 90028, United States'], ['1365 N Scottsdale Rd, Scottsdale, AZ 85257, United States',
'350 W Washington St, Tempe, AZ 85281, United States',
'501 E. Orange St., Tempe, AZ 85287, United States']...

1 Ответ

0 голосов
/ 06 ноября 2019

Из того, что я понял из вашего вопроса, этот код может помочь вам отсортировать адреса так, как вы хотите:

Код

function sorting() {
 //get distance
  var outputSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Maps");
  var relstatecodes = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Filtered States");
  var reladdresses = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Relevant Addresses");
  var lastrow = relstatecodes.getLastRow();
  var lastrow2 = reladdresses.getLastRow()
  var range = relstatecodes.getRange(3,1, lastrow-2,1);
  var range2 = reladdresses.getRange(2,3, lastrow2-1,1);

  var statecodes = range.getValues();
  var stateaddresses = range2.getValues();
  var reladdresses = [];
  var clusterObj = {};

  // Let´s iterate through the array with the state codes
  statecodes.forEach(function(el){
     clusterObj[el] = [];
    // We take all the state addresses
    for(var i in stateaddresses){
      // We check if the state address includes the state code 
      if( stateaddresses[i].toString().indexOf(" " + el + " ") > - 1){
         // If it is included then we build the JavaScript object
        clusterObj[el].push(stateaddresses[i][0]);
      }
    }
  });

   // Logger.log(clusterObj);

  // You can check in this way the addresses by state code
  Logger.log(clusterObj["AZ"]);
  Logger.log(clusterObj["CA"]); 

}

Вывод

 [1365 N Scottsdale Rd, Scottsdale, AZ 85257, United States, 350 W Washington St, Tempe, AZ 85281, United States, 501 E. Orange St., Tempe, AZ 85287, United States, 2323 W 14th St, Tempe, AZ 85281, United States, 1555 W University Dr #103, Tempe, AZ 85281, United States,  2844 West Deer Valley Road, Phoenix, AZ 85027, United States]
[19-11-06 15:55:56:760 CET] [1000 S Fremont Ave #5, Alhambra, CA 91803, United States, 4021 Rosewood Ave, Los Angeles, CA 90004, United States, 919 S Grand Ave, Los Angeles, CA 90015, United States, 7335 N Palm Bluffs Ave, Fresno, CA 93711, United States, 6363 Sunset Blvd, Los Angeles, CA 90028, United States, 9331 Mariposa Rd, Hesperia, CA 92344, United States, 2041 Business Center Dr, Irvine, CA 92612, United States, 5757 Plaza Dr #100, Cypress, CA 90630, United States, 257 Longford Dr #5, South San Francisco, CA 94080, United States, 151 Innovation Dr, Irvine, CA 92617, United States, 5 Hutton Centre Dr #500, Santa Ana, CA 92707, United States, 8620 Spectrum Center Boulevard Suite 600, San Diego, CA 92123, United States]

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...