見出し画像

【GAS】Google Apps Script 活用事例 各シートから取得した2次元配列を連結するスクリプト

今回の自動化のイメージ図

エンジニアとデザイナーの応募者管理を別のシートで管理していて、
内定者だけ各シートから取得したいとニーズがあり書いてみました。

各シートから取得した2次元配列を結合して新しい2次元配列を作る、そんなイメージでしょうか?

CONCATメソッド

スクリプト

function getOfferedApplicants() {

  //取得したいシートのURLを列挙していく
  const targetUrl = {
    sheet1: 'https://docs.google.com/spreadsheets/d/******************/edit#gid=*********',
    sheet2: 'https://docs.google.com/spreadsheets/d/******************/edit#gid=*********',
  };
  const spreadsheet = SpreadsheetApp.openByUrl(targetUrl.sheet1);
  const sheets      = spreadsheet.getSheets();
 
 //見出し行の項目 シートごとに見出しが違う場合を想定して2つ変数を用意しています。
  const column1 = {
    name:    '氏名',
    mobile:  '携帯電話番号',
    address: '住所'
  }

  const column2 = {
    name:    '名前',
    mobile:  '携帯',
    address: '住所'
  }

  const columns = [column1, column2];

  let count = 0;
  let temp,temp2,newValues; //一時的に2次元配列を格納する変数

  for(const sheet of sheets){
    const sheetId = sheet.getSheetId();
    
    //シートIDが0の場合はスキップする
    if(sheetId === 0)continue;
    
    //前述のURLの中にシートIDが含まれているかを確認
    //型を考慮しなくてもOK
    if(targetUrl.sheet1.includes(sheetId) || targetUrl.sheet2.includes(sheetId)){
      console.log(`シート名:${sheet.getName()}`);
      const values = sheet.getDataRange().getValues();

      if(count === 0){
        //temp = selectColumn_(values, columns[count], '内定受諾'); //特定のキーワードを含む配列を抽出したい場合
        temp = selectColumn_(values, columns[count]);

      }else if(count === 1){
        temp2     = selectColumn_(values, columns[count])
        newValues = temp.concat(temp2);
      }
      count += 1;
    }
  }
  console.log('結合後');
  console.log(newValues);
  console.log(`${newValues.length} 人`);
}



/**
 * getDataRange()などで取得した2次元配列から必要な列だけを抽出し、新しい2次元配列を作成する
 * 
 * @param  {object} 元の2次元配列
 * @param  {object} 見出し行のオブジェクト (例)column = {id: 0, name: 1, university: 3}
 * @param  {string} 2次元配列から情報を取捨選択するためのキーワード
 * @return {object} 新しい配列
 *
 */
function selectColumn_(values, column, keyWord){
  const header = values.shift();
  const keys   = Object.keys(column);
  console.log('keys', keys);
  
   //{name: 氏名'}から{name: 0}のように上書きをする
  keys.map((key) => {
    console.log(`column[${key}]:  ${column[key]}`);
    column[key] = header.indexOf(column[key]);
  });

  console.log('上書き後', column);

  const numbers = keys.map(key => column[key]);
  console.log('numbers', numbers);


  //indexに該当する列だけを残して2次元配列を作成する
  const newValues = values.map(array => array.reduce((accumulator, current, index) =>{
      if(numbers.includes(index)){
        accumulator.push(current);
      }
    return accumulator
    }, [])//reduce
  );//map

  if(!keyWord){
   //keyWordが省略されており、定義されていない場合、空白行の配列を取り除く
    const filtered = newValues.filter(row => row[0] !== '');
    console.log(filtered);

    return filtered

  }else if(keyWord){
    //newValuesから、さらに特定の単語が含まれている配列のみを残す
    const filtered = newValues.filter(row => row.indexOf(keyWord) !== -1);

    console.log(filtered);
    return filtered
  }
}

UserLocalさんのダミーデータ作成ツール

今回、こちらのダミーデータ生成ツールを利用しました。

関連するエントリー


この記事が気に入ったらサポートをしてみませんか?