GASでgetDataRangeすると、行(横)ごとに配列になる問題
例えば
const sorceData = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("参照");
const sorceVal = sorceData.getDataRange().getValues();
console.log(sorceVal);
//[['請求書ID','クライアント名','契約月','契約内容','金額'],
//['123456','○○','9月','○○契約','100万円'],・・・]
行でわけないで~となってしまうのを、forで列ごとに入れなおす。
function getColumn(vals,row){
//すべての列をいれる配列
column_arr =[];
for(let i =0; i < vals[0].length; i++){
//一列ごとに入れるようの配列
column_arr[i] = [];
for(let u =0; u < row; u++){
column_arr[i][u] = vals[u][i];
}
}
return column_arr;
}
上記の関数を使ってVLOOKUPできるようにしてみた
const wsData = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("結果");
const wsVal = wsData.getDataRange().getValues();
const wsRow_Num = wsData.getLastRow();
function lookup(){
//行ごとに配列に入るデータを列ごとに配列に入れなおす
let column_arr = getColumn(sorceVal,sorceRow_Num);
let ws_column_arr = getColumn(wsVal,wsRow_Num);
//wsdataのA列に検索キーワード 参照のA列にも同じキーワード
//column_arr[0]にA列すべて
//結果シートのA列をひとつずつelementにして
ws_column_arr[0].map((element,index)=>{
//参照シートのA列から同じものを探して、何行目にあるか(配列の何個めか)
let matchRow_num = column_arr[0].indexOf(element);
//検索結果をいれる配列
let result = [];
//さらに一行ごとに入れる用の配列
let result_sm = [];
//indexOfで値が見つからなかったときは-1になる
if(matchRow_num !== -1){
// 参照シートの該当行の値をすべて配列に入れていく
for(let i =1; i < column_arr.length; i++){
result_sm.push(column_arr[i][matchRow_num]);
}
}else{
//該当なしの場合はブランク
result_sm.push("");
}
//横一行に配列を入れていく方法 配列をさらに配列でくくる
result[index] = [result_sm];
//できた配列を一行ずつ入れていく
wsData.getRange(index+1,2,1,result[index][0].length).setValues(result[index]);
});
}