2017-04-19 24 views
0

スプレッドシートのすべてのシートをGoogleドライブに1つのPDFとして保存しようとしています(最終的にはメールをもらいたい)。私はシートの1つ以上を保存することに問題があります。私はそれをやり遂げる複数の方法を試みました。以下のコードは私がこれまでに見つけた最良の方法です。再度問題は、最初のページをPDFとして保存するだけなので、削除冗長シートを回避する方法を理解できません。私が見たすべての投稿は1ページを保存したいだけで、24ページ以上を1つのPDFとして保存する必要があります。あなたの助けを前もってありがとう!Google App Script - Googleドライブに保存されたPDFにスプレッドシートを保存する

function PDF() { 
    var sheetName = SpreadsheetApp.getActiveSpreadsheet(); 
    var folderID = "*** Google Drive ID***"; // Folder id to save in a Drive folder. 
    var ss = SpreadsheetApp.openByUrl(
    'https://docs.google.com/spreadsheets/d/***Spreadsheet ID***'); 
    var pdfName = "MAR - " + ss.getRange("A1:A1").getValue(); //Need to set the values to another sheet 

    var sourceSpreadsheet = SpreadsheetApp.getActive(); 
    var sourceSheet = sourceSpreadsheet.getSheetByName(sheetName); 
    var folder = DriveApp.getFolderById(folderID); 

    //Copy whole spreadsheet 
    var destSpreadsheet = SpreadsheetApp.open(DriveApp.getFileById(sourceSpreadsheet.getId()).makeCopy("tmp_convert_to_pdf", folder)) 

    //delete redundant sheets 
    var sheets = destSpreadsheet.getSheets(); 
    for (i = 0; i < sheets.length; i++) { 
    if (sheets[i].getSheetName() != sheetName){ 
     destSpreadsheet.deleteSheet(sheets[i]); 
    } 
    } 
    var destSheet = destSpreadsheet.getSheets()[0]; 

    //repace cell values with text (to avoid broken references) 
    var sourceRange = sourceSheet.getRange(1,1,sourceSheet.getMaxRows(),sourceSheet.getMaxColumns()); 
    var sourcevalues = sourceRange.getValues(); 
    var destRange = destSheet.getRange(1, 1, destSheet.getMaxRows(), destSheet.getMaxColumns()); 
    destRange.setValues(sourcevalues); 

    //save to pdf 
    var theBlob = destSpreadsheet.getBlob().getAs('application/pdf').setName(pdfName); 
    var newFile = folder.createFile(theBlob); 

    //Delete the temporary sheet 
    DriveApp.getFileById(destSpreadsheet.getId()).setTrashed(true); 
} 

答えて

0

ドライブAPIを使用すると、スプレッドシートからすべてのシートを含むPDFにスプレッドシートを変換できます。これを使用するには、次のようにGoogle API ConsoleでドライブAPIを有効にしてください。スクリプトエディタで

  1. 、リソースを選択>ダイアログの下部にあるクラウドプラットフォームプロジェクト

  2. 、GoogleのAPIコンソールのリンクをクリックしてください。

  3. コンソールで、フィルタボックスをクリックし、API「ドライブAPI」の名前の一部を入力して、名前をクリックします。

  4. 次の画面で、[Enable API]をクリックします。

  5. Developers Consoleを閉じてスクリプトエディタに戻ります。ダイアログで[OK]をクリックします。

スプレッドシートからPDFファイルを作成するためのサンプルスクリプトを用意しました。これをあなたのスクリプトに使用してください。

スクリプト:このスクリプトについて

var spreadsheetId = "#####"; 
var folderId = "#####"; 
var outputFilename = "#####"; 

var url = "https://www.googleapis.com/drive/v3/files/" + spreadsheetId + "/export?mimeType=application/pdf"; 
var options = { 
    method: "GET", 
    headers: {Authorization: "Bearer " + ScriptApp.getOAuthToken()}, 
    muteHttpExceptions: true 
}; 
var response = UrlFetchApp.fetch(url, options).getBlob(); 
DriveApp.getFolderById(folderId).createFile(response).setName(outputFilename); 

、私はそれはお使いの環境では動作しない場合、これは、正常に動作を確認しますが、私に教えてください。あなたの質問を誤解した場合、私は残念です。

追加1:

function PDF() { 
    var sheetName = SpreadsheetApp.getActiveSpreadsheet(); 
    var folderID = "*** Google Drive ID***"; // Folder id to save in a Drive folder. 
    var ss = SpreadsheetApp.openByUrl(
    'https://docs.google.com/spreadsheets/d/***Spreadsheet ID***'); 
    var pdfName = "MAR - " + ss.getRange("A1:A1").getValue(); //Need to set the values to another sheet 

    var sourceSpreadsheet = SpreadsheetApp.getActive(); 
    var sourceSheet = sourceSpreadsheet.getSheetByName(sheetName); 
    var folder = DriveApp.getFolderById(folderID); 

    //Copy whole spreadsheet 
    var destSpreadsheet = SpreadsheetApp.open(DriveApp.getFileById(sourceSpreadsheet.getId()).makeCopy("tmp_convert_to_pdf", folder)) 

    //delete redundant sheets 
    var sheets = destSpreadsheet.getSheets(); 
    for (i = 0; i < sheets.length; i++) { 
    if (sheets[i].getSheetName() != sheetName){ 
     destSpreadsheet.deleteSheet(sheets[i]); 
    } 
    } 
    var destSheet = destSpreadsheet.getSheets()[0]; 

    //repace cell values with text (to avoid broken references) 
    var sourceRange = sourceSheet.getRange(1,1,sourceSheet.getMaxRows(),sourceSheet.getMaxColumns()); 
    var sourcevalues = sourceRange.getValues(); 
    var destRange = destSheet.getRange(1, 1, destSheet.getMaxRows(), destSheet.getMaxColumns()); 
    destRange.setValues(sourcevalues); 

    //save to pdf 
// var theBlob = destSpreadsheet.getBlob().getAs('application/pdf').setName(pdfName); 
// var newFile = folder.createFile(theBlob); 


    // A sample script was added here. 
    var url = "https://www.googleapis.com/drive/v3/files/" + destSpreadsheet.getId() + "/export?mimeType=application/pdf"; 
    var options = { 
     method: "GET", 
     headers: {Authorization: "Bearer " + ScriptApp.getOAuthToken()}, 
     muteHttpExceptions: true 
    }; 
    var response = UrlFetchApp.fetch(url, options).getBlob(); 
    DriveApp.getFolderById(folderID).createFile(response).setName(pdfName); 


    //Delete the temporary sheet 
    DriveApp.getFileById(destSpreadsheet.getId()).setTrashed(true); 
} 

追加2:私はスクリプトでこれを追加する

function PDF() { 
    var folderID = "*** Google Drive ID***"; // Folder id to save in a Drive folder. 
    var ss = SpreadsheetApp.openByUrl(
    'https://docs.google.com/spreadsheets/d/***Spreadsheet ID***'); 
    var pdfName = "MAR - " + ss.getRange("A1:A1").getValue(); //Need to set the values to another sheet 
    var sourceSpreadsheet = SpreadsheetApp.getActive(); 
    var folder = DriveApp.getFolderById(folderID); 

    // A sample script was added here. 
    var url = "https://www.googleapis.com/drive/v3/files/" + sourceSpreadsheet.getId() + "/export?mimeType=application/pdf"; 
    var options = { 
     method: "GET", 
     headers: {Authorization: "Bearer " + ScriptApp.getOAuthToken()}, 
     muteHttpExceptions: true 
    }; 
    var response = UrlFetchApp.fetch(url, options).getBlob(); 
    DriveApp.getFolderById(folderID).createFile(response).setName(pdfName); 
} 
+0

? – Culper711

+0

私の貧しい答えには申し訳ありません。私は自分の答えを更新し、あなたのスクリプトを「追加」したスクリプトを追加しました。これをチェックしてください。 – Tanaike

+0

私はそれを試みて、私は同じエラーが発生し続ける、あなたは文書の最後のシートを削除することはできません。 (行19、ファイル "PDF Stack") – Culper711

関連する問題