[GAS] 스프레드 시트에서 조합을 생성하는 스크립트

10180 단어 GoogleAppsScript

목적



조합을 만들고 싶다.

결론



코드


// 直積集合
function cartesian_product(array) {
  return array.reduce(function(a,b){
      return a.map(function(x){
          return b.map(function(y){ return x.concat(y) })
        }).reduce(function(a,b){ return a.concat(b) },[])
    }, [[]])
}


function convert_values_to_array(values) {
  var array = []
  for(var i = 0; i < values.length; ++i){
    if( values[i][0] === ''){
      // pass
    } else {
      array.push(values[i][0])
    }
  }
  return array
}


function generate_combination() {
  const book = SpreadsheetApp.getActiveSpreadsheet()
  const sheet = {
      from: book.getSheetByName("from_name"), 
      out: book.getSheetByName("out_name")}
  // 出力先シートをきれいにしておく
  sheet.out.clear()

  const row = {
      first: 1, // Headerがあれば2 / なしなら1
      last: sheet.from.getLastRow()}
  const values = sheet.from.getDataRange().getValues()
  var array = []

  for (var j = 0; j < values[0].length; ++j) {
    array.push(convert_values_to_array(sheet.from.getRange(row.first, j+1, row.last).getValues()))
  }

  const r = cartesian_product(array)
  sheet.out.getRange(1, 1, r.length, r[0].length).setValues(r)
}

from 데이터





out 데이터





개요.



(실은, 약간 보는 모습 흉내이므로, 스스로도 이해하지 못하고 있는 곳이 있습니다.죄송합니다.)
직적 집합 사용할 수 있어? 같은 것을, 고전 시대의 동기에 말해졌으므로, 여러가지 검색했는데, 그것 같은데 맞았습니다.

Stack Overflow - Cartesian product of multiple arrays in JavaScript

여기 부분.
function cartesian_product(array) {
  return array.reduce(function(a,b){
      return a.map(function(x){
          return b.map(function(y){ return x.concat(y) })
        }).reduce(function(a,b){ return a.concat(b) },[])
    }, [[]])
}

좋은 웹페이지 즐겨찾기