前提・実現したいこと
下記のコードを実行してスプレッドシートを作成したいが,ドキュメントが作成される.
スプレッドシートはcreateSSheetという関数内で実行しています.
mime typeもあっているはずですがなぜなのでしょうか・
下記サイトを参考にしています.
https://qiita.com/tanaike/items/8c82392ef2749892061c
発生している問題・エラーメッセージ
エラーは特になし
該当のソースコード
GooogleAppScript
1function main() { 2 3 const ctrsheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet() 4 const folderID = ctrsheet.getRange("A2").getValue() 5 try{ 6 var pastsheet = ctrsheet.getRange(7, 1, ctrsheet.getLastRow()-6, 1).getValues().toString().split(",") 7 var pastsheetID = ctrsheet.getRange(7, 2, ctrsheet.getLastRow()-6, 1).getValues().toString().split(",") 8 9 }catch(e){ 10 var pastsheet = ctrsheet.getRange(7, 1, ctrsheet.getLastRow()-5, 1).getValues().toString().split(",") 11 var pastsheetID = ctrsheet.getRange(7, 2, ctrsheet.getLastRow()-5, 1).getValues().toString().split(",") 12 13 } 14 15 const pdfTo = ctrsheet.getRange("E2").getValue() 16 17 const today = new Date() 18 //const todayDate = today.getDate() 19 const todayDate = 1 20 21 const ssheetName = Utilities.formatDate(today, "JST", "yyyyMM") 22 23 //毎月1日に当該月のスプレッドシートを作成 24 25 if(pastsheet.includes(ssheetName) == true){ 26 //過去に同名のスプレッドシートを作ったことがあるため作成しない 27 var flag = -1 28 29 }else if (pastsheet.includes(ssheetName) == false){ 30 //過去に同名のスプレッドシートを作ったことがないため作成する 31 var flag = 1 32 33 } 34 35 //毎日当該月のスプレッドシートに日付のシートを作成 36 if(todayDate == 1 && flag == 1){ 37 const datasheet = createSSheet(folderID,ssheetName) 38 const datasheetID = datasheet.id 39 var row = ctrsheet.getLastRow()+1 40 ctrsheet.getRange(row, 1, 1, 2).setValues([[ssheetName,datasheetID]]) 41 var tgtssheetID = datasheetID 42 43 } 44 45 46 Logger.log(todayDate == -1) 47 if (flag == -1 ){ 48 49 var tgtssheetID = pastsheetID[pastsheetID.length-1] 50 51 } 52 53 const tgtssheet = SpreadsheetApp.openById(tgtssheetID) 54 const tgtsheet = tgtssheet.insertSheet(Utilities.formatDate(today, "JST", "MM/dd")) 55 const tgtsheetID = tgtsheet.id 56 57 const pdf = createPDF(folderID, tgtssheetID, tgtsheetID, ssheetName) 58 const pdfName = Utilities.formatDate(today, "JST", "yyyy/MM/dd") 59 60 //Gmail似て送信する 61 //GmailApp.sendEmail(pdfTo,ssheetName) 62 63 64 Logger.log("stop") 65 66} 67 68function createSSheet(fID,ssheetname){ 69 70 const datasheet = Drive.Files.insert({ 71 "title": ssheetname, 72 "mimeType": "application/vnd.google-apps.spreadsheet", 73 "parents": [{"id": fID}] 74 }); 75 76 return datasheet 77} 78 79// PDF作成関数 引数は(folderid:保存先フォルダID, ssid:PDF化するスプレッドシートID, sheetid:PDF化するシートID, filename:PDFの名前) 80function createPDF(folderid, ssid, sheetid, filename) { 81 82 // スプレッドシートをPDFにエクスポートするためのURL。このURLに色々なオプションを付けてPDFを作成 83 var url = "https://docs.google.com/spreadsheets/d/SSID/export?".replace("SSID", ssid); 84 85 // 範囲をURL風に変換 86 var printRange = encodeURIComponent("A1:BE45"); 87 88 // PDF作成のオプションを指定 89 var opts = { 90 exportFormat: "pdf", // ファイル形式の指定 pdf / csv / xls / xlsx 91 format: "pdf", // ファイル形式の指定 pdf / csv / xls / xlsx 92 size: "B5", // 用紙サイズの指定 legal / letter / A4 など 93 portrait: "false", // true → 縦向き、false → 横向き 94 fitw: "true", // ページをフィットさせるかどうか。trueでフィット、falseで原寸大。 95 sheetnames: "false", // シート名をPDF上部に表示するか 96 printtitle: "false", // スプレッドシート名をPDF上部に表示するか 97 pagenumbers: "false", // ページ番号の有無 98 gridlines: "false", // グリッドラインの表示有無 99 fzr: "false", // 固定行の表示有無 100 gid: sheetid, // シートIDを指定 sheetidは引数で取得 101 range: printRange, // 範囲 102 top_margin: "0", // 上余白 103 bottom_margin: "0", // 下余白 104 left_margin: "0", // 左余白 105 right_margin: "0", // 右余白 106 scale: "3" // なんか幅に合わせたり高さに合わせたりできるらしい。 107 }; 108 109 var url_ext = []; 110 111 // 上記のoptsのオプション名と値を「=」で繋げて配列url_extに格納 112 for (optName in opts) { 113 url_ext.push(optName + "=" + opts[optName]); 114 } 115 116 // url_extの各要素を「&」で繋げる 117 var options = url_ext.join("&"); 118 // API使用のためのOAuth認証 119 var token = ScriptApp.getOAuthToken(); 120 // PDFファイルの保存先となるフォルダをフォルダIDで指定 121 var folder = DriveApp.getFolderById(folderid); 122 SpreadsheetApp.flush(); 123 // PDF作成 124 var blob = UrlFetchApp.fetch(url + options, { headers: { 'Authorization': 'Bearer ' + token }, muteHttpExceptions: true }).getBlob().setName(filename); 125 // 存在するなら削除 126 delExistsFile(folder, filename); 127 // 保存 128 var newFile = folder.createFile(blob); 129 // 共有設定をする:「リンクを知っている人」が「閲覧可能」 130 newFile.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.VIEW); 131 // ダウンロードリンクを取得 132 var newFileUrl = newFile.getUrl(); 133 // リンクを編集してPDFを埋め込むためのURLにする。そしてそれを返却。 134 return newFileUrl.slice(0, -17) + "preview"; 135} 136 137// 同じ名前のファイルが存在するなら削除する関数 138function delExistsFile(folder, fileName) { 139 var files = folder.getFilesByName(fileName); 140 141 while (files.hasNext()) { 142 var file = files.next(); 143 if(fileName == file.getName()) { 144 folder.removeFile(file); 145 return true; 146 } 147 } 148 149 return false; 150} 151 152 153
試したこと
該当の関数のみを実行した際は問題なくスプレッドシートを作成できました.
上記コード内に組み込んだ時にスプレッドシートではなくドキュメントが作成されてしまいます.
対処法をご教示いただければ幸いです.
補足情報(FW/ツールのバージョンなど)
GASのV8で実行しています.
createPDF で作ってるんじゃないですか?
ご指摘ありがとうございます.
createSSheetで作成しています.そちらで作成したスプレッドシートをcreatePDFでpdfにしています.
確認したところ,ドキュメントファイルではなく拡張子なしのファイルが作成されていました.
なにか対処方法をご存師でしたらご教示ください.
よろしくお願いいたします.
ご参考までに,下記のコードを単体で実行すると問題なくスプレッドシートを作成できました.
Drive.Files.insert({
"title": ファイル名,
"mimeType": "application/vnd.google-apps.spreadsheet",
"parents": [{"id": フォルダID}]
});
なにか原因があるのでしょうか.
そうじゃなく、createPDF でドキュメントができてるんじゃないですか?
これをコメントアウトしてやってみてください。
すいません.そのとおりでした.ありがとうございます.
解決したのであれば自己解決してください。
ちなみにこの時作成されたファイルを消すにはどのようにしたらよろしいでしょうか.
ドキュメントが作成された時点でidを取得し削除したいのですが,どの行で取得できるかおわかりでしょうか?お手数ですがよろしくおねがいします.
あなたの回答
tips
プレビュー