同一のカラム構成で複数のスプレッドシートがひとつのフォルダに入っていて、
それらをひとつのシートにまとめたくて書いたコードです。
例として以下のような2つのスプレッドシートがあって
1つ目のスプレッドシートのシート1(edit#gid=0)
2つ目のスプレッドシートのシート1(edit#gid=0)
その2つのシートをまとめてこういう3つ目のシートを作りたい
やりたいことを簡単に言うと
1つ目のシートと2つ目のシートの2行目から最終行までのデータを取得して
3つ目のシートにまとめる
そして1列目を昇順で並べ替える
FOLDER_ID と SPREADSHEET_URL を設定して
runGetAndSetValues() を実行する
コード.gs
var targetFolderId = 'FOLDER_ID';// 複数のシートが入っているフォルダID
var masterSheetUrl = 'SPREADSHEET_URL';// まとめるスプレッドシートのURL
var targetSpreadsheets = getFiles(targetFolderId);
/************************************
これを実行する
************************************/
function runGetAndSetValues() {
var ssIds = getSsIds(targetSpreadsheets);
setHeaderValues(ssIds);
for(var i = 0; i < ssIds.length; i++) {
var sheetValues = getSheetValues(ssIds[i]);
var sheet = SpreadsheetApp.openByUrl(masterSheetUrl).getSheets()[0];
setSheetValues(sheet, sheetValues);
}
sort(sheet);
}
/************************************
一行目に見出しの値を入れる
************************************/
function setHeaderValues(ssIds) {
var headerValues = getHeaderValues(ssIds);
Logger.log(headerValues)
var ss = SpreadsheetApp.openByUrl(masterSheetUrl);
var sheet = ss.getSheets()[0];
var range = sheet.getRange(1, 1, 1, headerValues[0].length);
range.setValues(headerValues);
}
/************************************
一行目に入れる見出しの値を取得する
************************************/
function getHeaderValues(ssIds) {
var ssId = ssIds[0];
var ss = SpreadsheetApp.openById(ssId);
var sheet = ss.getSheets()[0];
var last_col = sheet.getLastColumn();
var range = sheet.getRange(1, 1, 1, last_col);
var headerValues = range.getValues();
return headerValues;
}
/************************************
対象のスプレッドシートのIDを取得して返す
************************************/
function getSsIds(targetSpreadsheets) {
var ssIds = [];
for(var i = 0; i < targetSpreadsheets.length; i++) {
ssIds.push(targetSpreadsheets[i]['id']);
}
return ssIds;
}
/************************************
シートの値を取得して返す
************************************/
function getSheetValues(ssId) {
var ss = SpreadsheetApp.openById(ssId);
var sheet = ss.getSheets()[0];
var lastRow = sheet.getLastRow();
var lastCol = sheet.getLastColumn();
var range = sheet.getRange(2, 1, lastRow, lastCol);// 一行目はヘッダなので2行目から取得する
var values = range.getValues();
return values;
}
/************************************
シートに値を一気に入力する
************************************/
function setSheetValues(sheet, array){
var lastRow = sheet.getLastRow();
var startRow = lastRow + 1;
var startCol = 1;
var numRows = array.length;
var numCols = array[0].length;
var range = sheet.getRange(startRow, startCol, numRows, numCols);
range.setValues(array);
}
function sort(sheet){
var range = sheet.getRange(2, 1, sheet.getLastRow(), sheet.getLastColumn());
range.sort([{column: 1, ascending: true}]);
}
/************************************
フォルダ内のファイルを取得して
昇順にして返す
************************************/
function getFiles(targetFolderId) {
var fileProps = [];
var folder = DriveApp.getFolderById(targetFolderId);
var contents = folder.getFiles();
while(contents.hasNext()) {
var file = contents.next();
var name = file.getName();
var id = file.getId();
var obj = {};
obj["name"] = name;
obj["id"] = id;
fileProps.push(obj);
}
var sorted = objSort(fileProps);
return fileProps;
}
/************************************
並べ替える
************************************/
function objSort(fileProps) {
var ascending = fileProps.sort(asc);
return ascending;
}
/************************************
nameで昇順に並べ替える
************************************/
function asc(a, b){
var A = a.name;
var B = b.name;
if(A > B){
return 1;
}else if(A < B ){
return -1;
}else{
return 0;
}
}
|
関連記事
シートの1行目(ヘッダ行)の値を取得する
ヘッダの文字列を用意してシートの一行目に自動で入力したい
setValuesを使う話
Googleドライブ内のフォルダをフォルダ名で並べ替えて取得したい
シートのデータを昇順・降順でソートする