【やりたいこと】
Google Driveに複数あるスプレッドシートを、**”定期的かつ自動で”**エクセルに変換してPCに保管(バックアップ)したい。
【詳細】
Google Drive上に5つフォルダがあり、各フォルダ内には複数のスプレッドシートがあります。この複数あるスプレッドシートを月に1回、エクセルに変換したうえでPCにダウンロードして保管(バックアップ)したいと考えております。本件、手動で行えばできることは承知していますが、GASで(自動で)実現できないものか思案しております。
何か良い方法がありましたらご教示いただければ幸いです。
宜しくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
こんばんは。
時間が経ってしまっていますが、GASで目的の機能を調べてある程度の形になりましたので投稿させて頂きます。
「ダウンロードして保管」の部分は、ローカルPCに転送と考えると難しいように思えましたので、メール添付を代替案として実装しています。
以下コードで、targetFolderIdsへ5つのフォルダのID、mailtoへ送り先メールアドレスを記述して頂ければ、動作確認を頂けます。
フォルダは名前で取得する事もできますが、例えば違う階層で同じ名前のフォルダが存在するなどあると、意図しないフォルダも拾ってしまう可能性があるためIDを使って確実にする方が良いかと思いました。
フォルダ名がユニークである事が担保できるなら**getFolderByName()**を使っても良いと思います。
1function sendMail_Excel() { 2 // フォルダ、ファイル関係 3 var targetFolderIds = ["folder1", "folder2", "folder3", "folder4", "folder5"]; 4 var targetFolder; 5 var folderName; 6 var objFiles; 7 var objFile; 8 var fileName; 9 10 // スプレッドシート関係 11 var ss; 12 var key; 13 var sheets; 14 var sheetId; 15 16 // メール関係 17 var mailto = "@gmail.com"; 18 var subject = ""; 19 var body = ""; 20 21 // その他 22 var nowDate = Utilities.formatDate(new Date(), 'JST', 'yyyyMMdd'); 23 var fetchUrl; 24 var fetchOpt = { 25 "headers" : { Authorization: 'Bearer ' + ScriptApp.getOAuthToken() }, 26 "muteHttpExceptions" : true 27 }; 28 var xlsxName; 29 var attachmentFiles = new Array(); 30 31 32 for (var i = 0; i < targetFolderIds.length; i++) { 33 // Idから対象フォルダの取得 34 targetFolder = DriveApp.getFolderById(targetFolderIds[i]); 35 folderName = targetFolder.getName(); 36 body = body + folderName + "\n"; 37 38 // 対象フォルダ以下のSpreadsheetを取得 39 objFiles = targetFolder.getFilesByType(MimeType.GOOGLE_SHEETS); 40 41 while (objFiles.hasNext()) { 42 objFile = objFiles.next(); 43 fileName = objFile.getName(); 44 body = body + " - " + fileName + "\n"; 45 46 // Spreadsheetのオープン 47 ss = SpreadsheetApp.openByUrl(objFile.getUrl()); 48 key = ss.getId(); 49 sheets = ss.getSheets(); 50 51 // 各シートの処理 52 for (var sheetNum = 0; sheetNum < sheets.length; sheetNum++){ 53 sheetId = sheets[sheetNum].getSheetId(); 54 xlsxName = fileName + "_" + sheets[sheetNum].getName() + "_" + nowDate + ".xlsx"; 55 body = body + " [" + xlsxName + "]\n"; 56 57 // Excelファイルにして添付ファイルへ追加 58 fetchUrl = "https://docs.google.com/spreadsheets/d/" + key + "/export?gid=" + sheetId + "&format=xlsx&sheetnames=true"; 59 attachmentFiles.push(UrlFetchApp.fetch(fetchUrl,fetchOpt).getBlob().setName(xlsxName)); 60 } 61 } 62 } 63 64 // メール送信 65 subject = "[GoogleDrive]定期バックアップ(" + Utilities.formatDate(new Date(), 'JST', 'yyyy/MM/dd') + ")"; 66 MailApp.sendEmail(mailto, subject, body, {attachments:attachmentFiles}); 67}
また、「定期的かつ自動で」もトリガー設定で実現可能と思います。
ドライブへのアクセスやメール送信など、承認が必要な機能がありますので、それらは一度手動で実行して許可してしまえば問題ないと思います。(月トリガーで日と時間帯を指定)
追記 2015/09/24 18:27頃
編集 2015/09/26 20:48頃
Spreadsheet単位(Excelで言うワークブック単位)でxlsxファイルを作成し、メール添付出来るようにしたコードを追記させてもらいます。
ルールは前と同じで、「フォルダID」と「送信先メールアドレス」を指定して頂ければ動作確認する事ができると思います。
1function sendMail_Excel2() { 2 // フォルダ、ファイル関係 3 var targetFolderIds = ["folder1", "folder2", "folder3", "folder4", "folder5"]; 4 var targetFolder; 5 var folderName; 6 var objFiles; 7 var objFile; 8 var fileName; 9 var key; 10 11 // メール関係 12 var mailto = "@gmail.com"; 13 var subject = "[GoogleDrive]定期バックアップ(" + Utilities.formatDate(new Date(), 'JST', 'yyyy/MM/dd') + ")"; 14 var body = ""; 15 16 // その他 17 var nowDate = Utilities.formatDate(new Date(), 'JST', 'yyyyMMdd'); 18 var fetchUrl; 19 var fetchOpt = { 20 "headers" : { Authorization: "Bearer " + ScriptApp.getOAuthToken() }, 21 "muteHttpExceptions" : true 22 }; 23 24 var xlsxName; 25 var attachmentFiles = new Array(); 26 27 try 28 { 29 for (var i = 0; i < targetFolderIds.length; i++) { 30 // Idから対象フォルダを取得 31 targetFolder = DriveApp.getFolderById(targetFolderIds[i]); 32 folderName = targetFolder.getName(); 33 body = body + folderName + "\n"; 34 35 // 対象フォルダ以下のSpreadsheetを取得 36 objFiles = targetFolder.getFilesByType(MimeType.GOOGLE_SHEETS); 37 38 while (objFiles.hasNext()) { 39 objFile = objFiles.next(); 40 key = objFile.getId(); 41 fileName = objFile.getName(); 42 body = body + " - " + fileName + "\n"; 43 44 xlsxName = fileName + "_" + nowDate + ".xlsx"; 45 fetchUrl = "https://docs.google.com/feeds/download/spreadsheets/Export?key=" + key + "&exportFormat=xlsx"; 46 attachmentFiles.push(UrlFetchApp.fetch(fetchUrl, fetchOpt).getBlob().setName(xlsxName)); 47 } 48 } 49 } 50 catch(e){ 51 subject = "ERROR:" + subject; 52 body = "エラー : " + e.message; 53 } 54 55 // メール送信 56 MailApp.sendEmail(mailto, subject, body, {attachments:attachmentFiles}); 57}
投稿2015/09/20 11:14
編集2015/09/26 11:49総合スコア294
0
tetuさんへ
ごくごく簡単で、解決には到らないと思いますが、情報だけは挙げておきますね。
この機能はスタンドアロンスクリプトとしてContentクラスのContentServiceクラス、TextOutputクラスを利用して構築、WEBアプリとして実現可能です。
https://developers.google.com/apps-script/reference/content/
https://developers.google.com/apps-script/guides/content
WEBアプリとしてはスプレッドシートからCSVダウンロード、というものを構築したことがありますが、
トリガーでの実行はいくつかの制限がありますので、実現の可否としては「?」です。
(認証が必要なサービスや外部ファイルへのアクセス制限に引っかかる可能性があるためダメかと思います。)
以上です。
投稿2015/09/17 09:26
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/09/24 03:00
2015/09/24 09:30
2015/09/24 11:56
2015/09/25 00:10
2015/09/26 11:56
2015/09/28 01:01
2015/09/28 03:32
2015/12/09 07:41
2015/12/10 02:15
2015/12/10 08:30 編集
2015/12/10 08:08
2015/12/10 08:34
2015/12/10 09:17
2015/12/11 00:37
2015/12/11 14:14
2015/12/14 07:26
2015/12/14 09:11
2015/12/17 07:57
2015/12/17 12:09
2015/12/22 06:39