Google Apps Script 指定フォルダにコピー作成 + データを転記（スプレッドシート）

#はじめに
スプレッドシートを使って、笑えるほど！簡易的な**「見積書から請求書を指定フォルダに作成」**する方法をご紹介したい。

###用意するもの
・請求書のテンプレのスプレッドシート
・見積書のスプレッドシート
・請求書を保存したいフォルダ（共有フォルダとか）

コピー作成された請求書のテンプレに、見積書から取得したデータを転記する。

そもそもスプレッドシートで見積書とか、どうやって作るねん？？って方は[こちら](https://taromoteki.com/freelance-document-template/)を参考に。

ただ、今回は**「笑えるほど！簡易的な」**って事で、ループ処理をしてデータを取得！みたいな事はしない！！！

#適当な見積書を用意
<img width="641" alt="スクリーンショット 2019-12-17 15.13.54.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/7e820889-b874-99ce-84c3-ad92cf4d1af3.jpeg">

今回はこれだけ。
**もはやこれは見積書ではない。**

しかし、今回は**「指定フォルダにコピー作成 + データを転記」**という点にのみフォーカスしたい。
よって大目に見てほしい。。

#メニューにボタンを追加
請求書を作成するプログラムを発動させるためのボタンを配置する。
`ツール>スクリプトエディタ`でエディタを開く。

デフォルトで存在する`myFunction()`は消しましょう。

```javascript
function onOpen() {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('Custom')
    .addItem('請求書を生成', 'menuItem1')
    .addToUi();
}
```

こんな感じでメニューにボタンを作れたかと。
<img width="350" alt="スクリーンショット 2019-12-17 15.13.36.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/89ecb59f-828d-fd20-7478-c4041f7e6102.jpeg">


#指定フォルダにコピー作成 + データを転記
以下を追加

```javascript
// First itemをクリックした時の処理
function menuItem1() {
  
  //現在のスプレットシートを取得する
  var sheet1 = SpreadsheetApp.getActiveSheet();
  
  //コピーするスプレットシートのid（今回の場合は請求書のテンプレ）
  var templateid = "***";
  var template = DriveApp.getFileById(templateid);
  
  //保存先フォルダのオブジェクトを取得
  var destfolderid = "***";
  var destfolder = DriveApp.getFolderById(destfolderid);
  
   //見積書からデータを取得
    var name1 = sheet1.getRange(2, 2).getValue();
    var name2 = sheet1.getRange(3, 2).getValue(); 
    
    var filename = '請求書(' + name1 + ')';

   //このsheetが指定フォルダにコピー作成された請求書のテンプレ
    var sheet = template.makeCopy(filename, destfolder);
  
  //指定フォルダにコピー作成された請求書のテンプレを取得
   var copiedSheet = SpreadsheetApp.open(sheet);
   var sheets = copiedSheet.getSheets();

　 //取得したスプレッドシートから、１つ目のシートを取得（デフォルトでは'シート1'）
   var invoice = sheets[0];
  
  //データを転記
  //コピー先のシートの中のセルを指定して、コピー実行
  invoice.getRange(2, 2).setValue(name1);
  invoice.getRange(3, 3).setValue(name2);
}
```

##軽く解説
私自身、スッゲーつまずいたポイントがあるので是非解説したい。

###指定フォルダに保存するにはmakeCopy()

まず、コピー作成されたファイルを指定フォルダに保存したい場合、**`makeCopy()`を使う必要がある。**
よく似たもので`copy()`も存在するが、こっちでは保存先を指定できない。

で、`makeCopy()`を呼び出すには、**`template`を`DriveApp.getFileById()`を使って取得しないといけないっぽい。**

```javascript
  //こっちじゃmakeCopy()を使えない
  var template = SpreadsheetApp.openById('FileID');

  var templateid = "***";
  var template = DriveApp.getFileById(templateid);

  var sheet = template.makeCopy(filename, destfolder);
```

###必要なのは「シート名」！！
gasをやっていて、完全に間違えていたことがある。

それは**「ファイル名とシート名はイコールでは無い」**って事だ。

実は最初にたどり着いたのはこっち。

```javascript

  var filename = '請求書(' + name1 + ')';

  //このsheetが指定フォルダにコピー作成された請求書のテンプレ
  var sheet = template.makeCopy(filename, destfolder);

  var copiedSheet = SpreadsheetApp.open(sheet);
  var invoice = copiedSheet.getSheetByName('シート名');
  //最初は以下のようにしていた
  //var invoice = copiedSheet.getSheetByName(filename);
```

ここで盛大な勘違いをしていた。
`getSheetByName()`に**ファイル名を指定していたのだ。。**
getSheetって書いてあるのに・・・。でも仕方ない。あの時の自分は**スプレッドシートとシートの区別**が付いていなかったのだから。

デフォルトではシート名は「シート1」とわかっているが、以下のように取得できるようなのでそっちを採用。

```javascript
var sheets = copiedSheet.getSheets();
var invoice = sheets[0]; 
```

#最後に
しっかりとした請求書を作成するのに、参考になりそうなサイトを貼っておく。

https://www.atmarkit.co.jp/ait/articles/1802/05/news003_2.html