PDFを自動で複数作成し、結合した状態で指定のフォルダに格納するスクリプトをネットの情報をもとに独自アレンジを加えて作成。
いざ実行をさせた際に以下エラーが発生し、試行錯誤しましたが解決できず息詰まってしまい質問をさせていただきました。
<実現したいこと>
スプレッドシートの複数作成しているシートをそれぞれPDFにして仮フォルダに格納。
その後仮フォルダに格納されたPDFを1枚に結合して確定版のフォルダに格納。その際にフォルダ名も変更。
その後仮フォルダに保存されている複数のPDFを削除。
<その際のエラーメッセージ>
Exception: Request failed for https://docs.google.com returned code 400. Truncated server response: <!DOCTYPE html><html lang="ja"><head><meta name="description" content="ウェブ ワープロ、プレゼンテーション、スプレッドシート"><meta name="viewport" content="width=device-wid... (use muteHttpExceptions option to examine full response)
現在のところエラーとなっている以下の部分の対応を検証中ですがこれといって成果がなく・・・。
var blob = UrlFetchApp.fetch(url, options).getBlob().setName(name); //PDFを作成する
また前後部分も含めて調べてはいるものの根本的に間違っている可能性もありますが今のスキルレベルではなかなか特定ができず、
ご教示いただけますと幸いです。
よろしくお願い致します。
GAS
1function CreatePdf(){ //当該スプレッドシートをPDFに変換して指定のフォルダに保存するScript 2 3 var folderId = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"; //一時保管用のフォルダIDを定義 4 var ss = SpreadsheetApp.getActiveSpreadsheet(); //アクティブなスプレッドシートを取得 5 var sheet = ss.getSheetByName(sheetName2); //スプレッドシートの名前を取得 6 var LastRow = sheet.getRange(6, 29, 205, 1).getValues().filter(String).length; //空白の要素を除いた取得指定のスプレッドシートの長さを取得 7 var SheetIds = sheet.getRange(6, 29, LastRow, 1).getValues(); //指定範囲の値(シートID)を取得 8 var ssId = ss.getId(); //アクティブなスプレッドシートのIDを取得 9 var date = new Date(); //今日の日時情報を取得 10 var dateString = Utilities.formatDate(date, "Asia/Tokyo", "yyyyMMddHHmmss"); //日時情報を文字列に変換 11 12//表紙の6〜i行目に記載されたSheetIdに基づきPDFを生成する。 13 for (var i = 6; i <= SheetIds.length + 6; i++) { //「6」は繰り返しスタートの行数分をプラス 14 var shId = sheet.getRange(i, 29).getValue(); //指定シートの指定範囲の値を取得 15 var name = i + ".pdf"; //保存ファイルの名前を形式指定 16 var token = ScriptApp.getOAuthToken(); //アクセストークンを取得しAPIリクエストを送信する 17 var baseUrl = "https://docs.google.com/spreadsheets/d/" + ssId + "/export?gid=" + shId; //スプレッドシートをPDF出力するためのURLを設定 18 var pdfOptions //PDF出力のオプションを設定(URLの組み立て) 19 = "&exportFormat=pdf&format=pdf" //ファイル形式の指定 pdf / csv / xls / xlsx 20 + "&size=A4" //用紙サイズ (A4) 21 + "&portrait=true" //用紙の向き true: 縦向き / false: 横向き 22 + "&fitw=true" //ページ幅を用紙にフィットさせるか true: フィットさせる / false: 原寸大 23 + "&top_margin=0.50" //上の余白を設定 24 + "&right_margin=0.50" //右の余白を設定 25 + "&bottom_margin=0.50" //下の余白を設定 26 + "&left_margin=0.50" //左の余白を設定 27 + "&horizontal_alignment=CENTER" //水平方向の位置を設定 28 + "&vertical_alignment=TOP" //垂直方向の位置を設定 29 + "&printtitle=false" //スプレッドシート名の表示有無 trueで表示あり、falseで表示なし(記述方法 "&sheetnames=true") 30 + "&sheetnames=false" //シート名の表示有無 trueで表示あり、falseで表示なし(記述方法 "&sheetnames==true") 31 + "¬e=false" //??? 32 var url = baseUrl + pdfOptions; //PDFを作成するためのURL 33 var options = {headers: {'Authorization': 'Bearer ' + token}}; //headersにアクセストークンを格納する 34 var blob = UrlFetchApp.fetch(url, options).getBlob().setName(name); //PDFを作成する 35 var folder = DriveApp.getFolderById(folderId); //PDFの保存先フォルダを指定 36 folder.createFile(blob) //PDFを指定したフォルダに保存する 37 Logger.log(i) // 38 var staySecond = 2 //「秒数」を設定(PDFにする処理がHTTP(S)の通信を必要とするため以下の処理が必要) 39 Utilities.sleep(staySecond * 1000); //意図しないエラーを防ぐため一時的に処理を遅らせる処理を設定(時間がミリ秒単位のため1000掛ける) 40 } 41 42//一時保管フォルダのファイル一覧を取得して、1つのPDFに統合する。 43 var iteratorList = folder.getFiles(); //「folder」に対して全てのファイルを取得する 44 var pdfList = []; //リスト用の空の一次元配列を作成 45 var pattern = /.*.pdf$/; //拡張子(ファイルのタイプのこと:「.xlsx」「.pdf」など)の指定(正規表現) 46 while (iteratorList.hasNext()){ //「iteratorList」に対して一時保管フォルダにまだ取り出していないファイルが存在するかを判定 47 var file = iteratorList.next(); //「iteratorList」に対して反復処理でまだ取り出していないファイルがあれば「file」に格納 48 if (pattern.test(file.getName())){ //ファイルの拡張子(ファイルのタイプのこと:「.xlsx」「.pdf」など)をチェック 49 pdfList.push(file); //一次元配列に格納 50 } 51 } 52 var mergedFileName = FileName + dateString + ".pdf"; //結合後のPDFファイルのファイル名を指定 53 mergedFile = mergePdfs(folder, mergedFileName, pdfList); //PDFの結合を実行 54 a = merge 55 Logger.log("PDFs merged") 56 57//一時保管フォルダから統合したPDFを検索して、指定フォルダに移動させる。 58 var files = folder.getFilesByName(mergedFileName); //「folder」に対して全ての結合後のPDFファイルのファイル名を「files」に格納 59 while (files.hasNext()) { //「filse」に対して一時保管フォルダにまだ取り出していないファイルが存在するかを判定 60 var file = files.next(); //「iteratorList」に対して反復処理でまだ取り出していないファイルがあれば「file」に格納 61 var fileName = file.getName(); //「file」に対して格納されている全てのファイル名を「fileName」に格納 62 console.log(fileName); 63 } 64 var storage = DriveApp.getFolderById('XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'); //結合後のPDFファイルを格納するフォルダIDを設定 65 file.moveTo(storage); //「file」に対して作成したファイルを指定先のフォルダに移動させる 66 Logger.log("Merged PDF moved") 67 68//一時保管フォルダに残された個別PDFを削除する。 69 var individualFiles = folder.getFiles(); //「folder」に対して全てのファイル名を取得 70 while(individualFiles.hasNext()){ //「individualFiles」に対してまだ取り出していないファイルが存在するかを判定 71 var file = individualFiles.next(); //「individualFiles」に対して反復処理でまだ取り出していないファイルがあれば「file」に格納 72 file.setTrashed(true); //「file」に対してファイルを削除 73 } 74 Logger.log("Individual files trashed") 75 76//おめでとう 77 Browser.msgBox("指定のフォルダにPDFが出力されました") // 78 79}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/04/23 12:16
退会済みユーザー
2021/04/23 14:00 編集
2021/04/24 01:36
退会済みユーザー
2021/04/24 06:32 編集
2021/04/25 12:07