javascript - 使用 Google-Apps-Script 上预定义的组形成集群

标签 javascript arrays google-apps-script google-sheets-api

我目前正在使用 Google Apps 脚本/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']...

最佳答案

根据我对您问题的理解,此代码可以帮助您按照您想要的方式对地址进行排序:

代码

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.

作为一个优点,我会留下这个Best practices文档,以防万一您想查看它,因为它可能对您的项目开发有所帮助。

关于javascript - 使用 Google-Apps-Script 上预定义的组形成集群,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58728357/

相关文章:

javascript - 使用相同的对象模型填充数组

javascript - 删除 Google App 脚本中数组中的特定空项

javascript - jQuery select2 重新格式化 <select> 但提交选项 ID 而不是值

java - 什么是NumberFormatException,我该如何解决?

javascript - getElementById 在 asp.net 中不起作用

mysql - 我的一个查询现在在正常工作 10 年后只返回一条记录 - 我没有更改任何代码

google-apps-script - 如何自定义工作表标签的右键弹出菜单

google-apps-script - Google Developers Console - 获取项目 ID 的功能?

javascript - 将过滤后的文档从 Mongo 集合传输到另一个集合的最佳方法(在 Nodejs 中)

javascript - 拦截 react native webview 的每一个请求