【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さんのダミーデータ作成ツール
今回、こちらのダミーデータ生成ツールを利用しました。
関連するエントリー
この記事が気に入ったらサポートをしてみませんか?