見出し画像

【GAS】Google Apps Script 活用事例 特定のシート1枚だけをExcelに変換する超〜便利スクリプト

G suiteの立ち位置は、WindowsとMacのOSシェアの分布に似ているような気がします。ExcelやWord、Power Point、いわゆるOfficeが中心で、spreadsheetはメインストリームではない(憶測ですが).....そんな気がします。

官公庁向けの許認可が関係してくるビジネスでは、先方の言うことが絶対であり、「提出はExcelで。」と言われたら、かしこまりました。と言う以外にありません。

「Excelだと、GAS使えないじゃん....。」

今まで、GASで自動化してやんよ!!と威勢の良かった僕も、「....Excel....シュン」となる事が多かったのですが、今回、自動化に成功しました。下記のような手順です。

1. Spreadsheet側で提出段階まで作成する
2. 特定のシート1枚だけをExcelに変換
3. シートタブのリネーム、シート1を削除
4. 変換し終わったら、spreadsheetを削除する

完成形のスクリプト

function convertToExcel(){
 var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
 var sheet       = spreadsheet.getSheetByName('Excel');
 
 Logger.log(sheet.getName());
 
 //1ヶ月前の日付を生成
 var date      = new Date();
 var month     = date.getMonth()+1;
 date.setMonth(month-2);
 var lastMonth = Utilities.formatDate(date, 'JST', 'YYYY_MM_');
 var fiileName = lastMonth + 'ファイル名';
 
 /*GASからDrive APIを利用するためには下記2点の設定が必要です。
 プロジェクトを開いて、上部の 「リソース」 - 「Googleの拡張サービス」  - 「Drive API」をONにする。
 Googleデベロッパーコンソールのライブラリにて 「Google Drive API」 を検索して有効にする。*/
 
 var newSpreadsheet = Drive.Files.insert({
   "title":   fiileName,
   "mimeType": "application/vnd.google-apps.spreadsheet",
   "parents":  [{"id": '******************'}]
 });
 var ssId  = SpreadsheetApp.openById(newSpreadsheet.id);
 var getId = ssId.getId();
 Logger.log(ssId.getName());
 
 /*現在のSpreadsheetから新規に作成したシートに特定のシートをコピー*/
 sheet.copyTo(ssId);
 
 /*名前の変更と余計なシートの削除*/
 var targetSheet  = ssId.getSheetByName('Excel のコピー');
 targetSheet.setName('Excel');
 var deleteSheet  = ssId.getSheets();
 ssId.deleteSheet(deleteSheet[0]);
 
 /*excelに変換後の用済みファイルをDriveから消す*/
 var fldId     = '*************'; // ブランクの場合はマイドライブ直下に
 var fetchUrl  = 'https://docs.google.com/feeds/download/spreadsheets/Export?key=' + getId + '&exportFormat=xlsx';
 var fetchOpt  = {'headers' : { Authorization: 'Bearer ' + ScriptApp.getOAuthToken()},
                  'muteHttpExceptions' : true
                 };
                 
 var file      = UrlFetchApp.fetch(fetchUrl, fetchOpt).getBlob().setName(fiileName);
 DriveApp.getFolderById(fldId).createFile(file);
 DriveApp.getFolderById(fldId).removeFile(DriveApp.getFileById(getId));
}

今回、作成する際に参考になったのが、上記のブログです。

var newSpreadsheet = Drive.Files.insert({
   "title":   fiileName,
   "mimeType": "application/vnd.google-apps.spreadsheet",
   "parents":  [{"id": '******************'}]
 });

この部分は、モロパクリです。詳しい事は上記ブログに書いてあるのですが、DriveAppで指定のフォルダに新しいspreadsheetを作る事が、なぜか出来ないため、高度なDrive APIを使います。その際は設定が必要。

シートを特定のspreadsheet(ファイル内)にコピーする

/*現在のSpreadsheetから新規に作成したシートに特定のシートをコピー*/
sheet.copyTo(ssId);

このたった一行だけで、新しく作成したspreadsheetに特定のシートをコピーする事が出来てしまいます。

一番左のシートを削除する

/*名前の変更と余計なシートの削除*/
var targetSheet  = ssId.getSheetByName('Excel のコピー');
targetSheet.setName('Excel');
var deleteSheet  = ssId.getSheets();
ssId.deleteSheet(deleteSheet[0]);

getSheets()メソッドは、全てのシートを配列で取得する事が出来ます。

ちなみに一番右のシートを取得するには?

var anotherSpreadsheet = SpreadsheetApp.openById('*********');
var getSheetsLength    = anotherSpreadsheet.getSheets().length;
Logger.log(getSheetsLength);
 
/*シートの作成場所の指定 一番右に配置、シート40などの名前でシートを取得*/
var newSheet     = anotherSpreadsheet.insertSheet(getSheetsLength);
var newSheetName = newSheet.getName();
Logger.log(newSheetName);

getSheets().length で、シートの枚数が返ってきます。例えば、5枚シートがあるとすると、5と返ってきます。anotherSpreadsheet.insertSheet(getSheetsLength) これでシートの右側に新規シートを作成する事が出来ます。getSheets()[配列番号]でする場合は、配列番号が、0から始まるので、-1する事が必要かと思います。

こちらも月次集計処理で使用しているので、後日、記事にしようかなと思っています。

ここまでの処理で、特定のシート1枚だけになったspreadsheetをExcelに変換します。変換し終えたspreadsheetは、要らないので削除します。

var file      = UrlFetchApp.fetch(fetchUrl, fetchOpt).getBlob().setName(fiileName);
DriveApp.getFolderById(fldId).createFile(file);
DriveApp.getFolderById(fldId).removeFile(DriveApp.getFileById(getId));

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