LoginSignup
8
10

More than 5 years have passed since last update.

請求書作成プログラム

Posted at


function myFunction(){

  // PDFの保存先となるフォルダID 確認方法は後述
  var folderid = "XXX";

  // マイドライブ直下に保存したい場合は以下
  // var root= DriveApp.getRootFolder();
  // var folderid = root.getId();

  /////////////////////////////////////////////  
  // 現在開いているスプレッドシートをPDF化したい場合//
  ////////////////////////////////////////////
  // 現在開いているスプレッドシートを取得
  var ss = SpreadsheetApp.getActiveSpreadsheet();

  // 現在開いているスプレッドシートのIDを取得
  var ssid = ss.getId();

// 現在開いているスプレッドシートのシートIDを取得
// var sheetid = ss.getActiveSheet().getSheetId();
// getActiveSheetの後の()を忘れると、TypeError: オブジェクト function getActiveSheet() {/* */} で関数 getSheetId が見つかりません。

  // スプレッドシートのシートIDを取得
  var sheetid = SpreadsheetApp.getActiveSpreadsheet().getSheets();

  // シート数
  var intMaxIndex = sheetid.length;

  // シート数を元にループで回してPDF発行
  for (intIndex = 0; intIndex < intMaxIndex; intIndex++) {

    // 処理が追い付かないのでスリープを入れる
    if(intIndex == 4 || intIndex == 7 || intIndex == 10 || intIndex == 13){
    Utilities.sleep(20000);
    }

    // シートIDを一つずつ取得
    var sheetids = [];
    sheetids = sheetid[intIndex].getSheetId();

    // ファイル名に使用する名前を取得
    var customer_name = [];
    customer_name = sheetid[intIndex].getName();
    //customer_name = ss.getRange("B3").getValue();
    // ここで例として使用しているスプレッドシートのC15に顧客の名前が入っているため、それをファイル名用に取得しているだけです。

    // ファイル名に使用するタイムスタンプを取得
    var timestamp = getTimestamp();

    // PDF作成関数
    createPDF( folderid, ssid, sheetids, customer_name + "_" + timestamp );
  }
}

// PDF作成関数 引数は(folderid:保存先フォルダID, ssid:PDF化するスプレッドシートID, sheetid:PDF化するシートID, filename:PDFの名前)
function createPDF(folderid, ssid, sheetid, filename){

  // PDFファイルの保存先となるフォルダをフォルダIDで指定
  var folder = DriveApp.getFolderById(folderid);

  // スプレッドシートをPDFにエクスポートするためのURL。このURLに色々なオプションを付けてPDFを作成
  var url = "https://docs.google.com/spreadsheets/d/SSID/export?".replace("SSID", ssid);

  // PDF作成のオプションを指定
  var opts = {
    exportFormat: "pdf",    // ファイル形式の指定 pdf / csv / xls / xlsx
    format:       "pdf",    // ファイル形式の指定 pdf / csv / xls / xlsx
    size:         "A4",     // 用紙サイズの指定 legal / letter / A4
    portrait:     "true",   // true → 縦向き、false → 横向き
    fitw:         "true",   // 幅を用紙に合わせるか
    sheetnames:   "false",  // シート名をPDF上部に表示するか
    printtitle:   "false",  // スプレッドシート名をPDF上部に表示するか
    pagenumbers:  "false",  // ページ番号の有無
    gridlines:    "false",  // グリッドラインの表示有無
    fzr:          "false",  // 固定行の表示有無
    gid:          sheetid   // シートIDを指定 sheetidは引数で取得
  };

  var url_ext = [];

  // 上記のoptsのオプション名と値を「=」で繋げて配列url_extに格納
  for( optName in opts ){
    url_ext.push( optName + "=" + opts[optName] );
  }

  // url_extの各要素を「&」で繋げる
  var options = url_ext.join("&");

  // optionsは以下のように作成しても同じです。
  // var ptions = 'exportFormat=pdf&format=pdf'
  // + '&size=A4'                       
  // + '&portrait=true'                    
  // + '&sheetnames=false&printtitle=false' 
  // + '&pagenumbers=false&gridlines=false' 
  // + '&fzr=false'                         
  // + '&gid=' + sheetid;

  // API使用のためのOAuth認証
  var token = ScriptApp.getOAuthToken();

    // PDF作成
    var response = UrlFetchApp.fetch(url + options, {
      headers: {
        'Authorization': 'Bearer ' +  token
      }
    });

    // 
    var blob = response.getBlob().setName(filename + '.pdf');

  //}

  // PDFを指定したフォルダに保存
  folder.createFile(blob);

}

 // タイムスタンプを返す関数
  function getTimestamp () {
    var now = new Date();
    var year = now.getYear();
    var month = now.getMonth();

    // 日時はいらないので、コメントアウト
    //var month = now.getMonth() + 1; 当月が表示される
    //var day = now.getDate();
    //var hour = now.getHours();
    //var min = now.getMinutes();
    // var sec = now.getSeconds();

    return year + "" + month + "月分";
    //return year + "_" + month + "_" + day + "_" + hour + min;

  }

// スプレッドシートのメニューからPDF作成用の関数を実行出来るように、「スクリプト」というメニューを追加。
function onOpen() {
    var sheet = SpreadsheetApp.getActiveSpreadsheet();
    var entries = [       
        {
            name : "請求書PDFを作成する",
            functionName : "myFunction"
        }
        ];
    sheet.addMenu("PDFを作成", entries);
};


8
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
10