Google DocumentをGASでコピーしてオーナー権限も委譲しちゃう

## はじめに
この記事はGoogle Apps Script Advent Calendar 2022の22日目の記事です。

https://qiita.com/advent-calendar/2022/google-apps-script

## 概要
初めてのアドベントカレンダーの参加でドキドキしながら記事を書いています。笑
何を書くか迷ったのですが、GASを触り始めてからずっと取り組んでいる、「Google Docsのコピー」について書こうと思います。といってもただコピーについて書いても面白みがないと思ったので、ひと工夫したいと思います。

## 作るもの
- ドキュメントをコピーする
- コピーしたドキュメントに情報を書き込む
- コピーしたドキュメントのオーナー権を移す

このシステムを、たとえばSlackのスラッシュコマンドで情報を入力してもらって起動する、みたいな使い方をしています。

### なぜオーナー権限を移す？
コピーされたドキュメントはオーナーが必ずそのスクリプトを実行している人（つまり、自分）になります。
自動化をしたときに、このシステムを使うのは必ずしも自分だけではないですよね。そうなった時に、この仕様は少し困ってしまいます。最も困る場面は、ドキュメントに対してコメントが入った時でしょう。この時メールで通知が来るのは自分ですが、一番通知が届いてほしいのが自分じゃない場合もあって結構不便です。
コピーした時にあらかじめオーナー権限を委譲しておけば、こうした問題を回避できるのでまあまあ便利だと思います。

## さっそくやっていく
てきとうにフォルダを作って次のようにGoogle DocumentとGASのプロジェクトを作ります。

![スクリーンショット (174).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671694/4d8ba2d2-6288-68c1-e32e-962db0eabb26.png)

コピー元ドキュメントはこんな感じで書いておきました。

![スクリーンショット (173).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671694/a3293228-1e01-4aac-abfc-32c6aff75fd1.png)

フォルダのIDとドキュメントのIDをこぴっておきましょう。
続いてGASの方にコードを書いていきます。

### 1. シンプルにコピーする

```javascript
function copyDocument() {
  // コピー元DocumentのIDをここに入れる
  const formatFilePath = DriveApp.getFileById("");
  // コピー先のフォルダのIDをここに入れる
  const folderPath = DriveApp.getFolderById("");
  // コピー先のドキュメントの名前
  let fileName = "コピー先ドキュメント";

  // コピーする
  formatFilePath.makeCopy(fileName, folderPath);
}

```

実行してみるとさっきのドライブにコピーされたファイルが出来ているのがわかります。

![スクリーンショット (175).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671694/f5ad814c-bed7-2d0c-d2fb-a7fb68df48ea.png)

### 2. 中身を変える
次のようにコードを書くと、中身を変えることができます。コピー元ドキュメントの「今日の日付」「なまえ」と書いた部分を置き換えるといったことをやってみます。

```javascript
function copyDocument() {
  // コピー元DocumentのIDをここに入れる
  const formatFilePath = DriveApp.getFileById("");
  // コピー先のフォルダのIDをここに入れる
  const folderPath = DriveApp.getFolderById("");
  // コピー先のドキュメントの名前
  let fileName = "コピー先ドキュメント2";

  // コピーする
  const newFile = formatFilePath.makeCopy(fileName, folderPath);

  // コピーしたドキュメントの名前を置き換える
  const doc = DocumentApp.openById(newFile.getId());
  let body = doc.getBody();

  const today = new Date();
  body.replaceText("今日の日付", Utilities.formatDate(today, "JST", "YYYY/MM/dd"));
  body.replaceText("なまえ", "KojoBarbie");
  doc.saveAndClose();
}

```

実行してみると新しいドキュメントが出来ます。中身を覗いてみましょう。

![スクリーンショット (177).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671694/55c11229-4e4e-2985-2d4c-d8a91639ba34.png)

確かに置き換わっています。

### 権限を変えてみる
ラストに、前述したとおり権限を変えてみるのをやってみます。
左のメニューから「サービス」の横の+を押して、「Drive API」を探して追加してください。IDは「Drive」で大丈夫です。
終わったら次のようにコードを書きます。

```javascript
function copyDocument() {
  // コピー元DocumentのIDをここに入れる
  const formatFilePath = DriveApp.getFileById("");
  // コピー先のフォルダのIDをここに入れる
  const folderPath = DriveApp.getFolderById("");
  // コピー先のドキュメントの名前
  let fileName = "コピー先ドキュメント3";

  // コピーする
  const newFile = formatFilePath.makeCopy(fileName, folderPath);
  Drive.Permissions.insert(
    {
      'role': 'owner',
      'type': 'user',
      // メールアドレスをここに入れる
      'value': ""
    },
    newFile.getId(),
    {
      // ここをfalseにすると通知のメールが届かなくなる
      'sendNotificationEmails': 'true'
    }
  );
}

```

実行すると権限がかわり、オーナーを譲られたメールアドレスにはメールが届いているはずです。sendNotificationEmailsをfalseにするとメールも届かなくなります。

## おわりに
なかなか便利にドキュメントをコピーすることができました。機会があれば試してみてください。