GASでSheets APIを扱う方法

この記事の続きです。
https://qiita.com/plumfield56/items/1c5ab661a598c433c5a7

spreadsheets.valuesでデータを取得したり、貼り付けしたり、
Sheetをコピーしたりすることはできました。

![2021-12-11_15h31_16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428239/7f50124a-435c-3ff4-e449-8565722912a1.png)

しかし書式ごとコピーしたり列追加、削除はspreadsheetsの内容で
操作しないとだめだったのでいくつか作成した関数を載せておきます。

![2021-12-11_15h34_49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428239/5d4d3bf7-53f8-2a28-3759-2c623533fe23.png)


## OAuth2でアクセストークンの取得

前の記事にも載せていたOAuth2のライブライでアクセストークンを取得できるファイルを用意します。

```js:OAuth
const CLIENT_ID = '';
const PRIVATE_KEY = '';
const CLIENT_EMAIL= '';

/**
 * Configures the spreadsheet service.
 */
function getSpreasheetService() {
  return OAuth2.createService("spreadsheet")
  .setTokenUrl('https://accounts.google.com/o/oauth2/token')
  .setClientId(CLIENT_ID)
  .setPrivateKey(PRIVATE_KEY)
  .setIssuer(CLIENT_EMAIL)
  .setPropertyStore(PropertiesService.getScriptProperties())
  .setScope('https://www.googleapis.com/auth/spreadsheets');
}
```

## リクエストbodyの作り方

https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/batchUpdate

bodyの作り方がどうするのかわからず苦戦しました。
検索して何かの記事で書かれていた内容を試してうまくいくことが確認できました。

ベースはこの形になります。

```js:body
{
  "requests": [
    {
      object (Request)
    }
  ],
}
```

objectにはリクエスト内容を入れていくのですが、
`AddNamedRangeRequest`だったら`addNamedRange`
`FindReplaceRequest `だったら`findReplace`をobjyectの位置に置いて詳細をきさいしていきます。

requestsは配列なので、複数リクエスト内容を下記のようにまとめて実行することができます。

```js:body例
{
  "requests": [
    {
      "addNamedRange": {
        // addNamedRangeに必要な内容
      }
    },
    {
      "findReplace": {
        // findReplaceに必要な内容
      }
    },
  ],
}
```

あとは各リクエストに必要な内容でリクエストbodyを作成すれば、「
すれば、Sheets APIでのスプレッドシート操作ができます。


## 書式ごとvaluesをコピー(copyPasete)

https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#copypasterequest


```js:copyPaste
/**
 * 書式ごとシートの内容をコピー
 * 
 * @param {string} accessToken - アクセストークン
 * @param {string} spreadsheetId - 操作するスプレッドシートID
 * @param {string} sourceSheetId - コピー元のシートID
 * @param {string} destinationSheetId - コピー先のシートID
 */
function copyPaste(accessToken, spreadsheetId, sourceSheetId, destinationSheetId) {

  const url = `https://sheets.googleapis.com/v4/spreadsheets/${spreadsheetId}:batchUpdate`;

  const body = {
    "requests": [
      {
        "copyPaste": {
          "source": {
            "sheetId": sourceSheetId,
            "startRowIndex": 0,
            "startColumnIndex": 0,
          },
          "destination": {
            "sheetId": destinationSheetId,
            "startRowIndex": 0,
            "startColumnIndex": 0,
          },
          "pasteType": "PASTE_NORMAL"
        }
      }
    ]
  };

  const res = UrlFetchApp.fetch(url,{
    'method': 'POST',
    'headers': {
      'Authorization': 'Bearer ' + accessToken,
    },
    'payload': JSON.stringify(body),
    'contentType': 'application/json',
    'muteHttpExceptions' : true,
  });

  console.log(res.getContentText());
}
```


## シート削除

https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#deletesheetrequest

```js:
/**
 * シート削除
 * 
 * @param {string} accessToken - アクセストークン
 * @param {string} spreadsheetId - 操作するスプレッドシートID
 * @param {string} deleteSheetId - 削除するシートID
 */
function deleteSheet(accessToken, spreadsheetId, deleteSheetId) {

  const url = `https://sheets.googleapis.com/v4/spreadsheets/${spreadsheetId}:batchUpdate`;

  const body = {
    "requests": [
      {
        "deleteSheet": {
          "sheetId": deleteSheetId
        }
      }
    ]
  };

  const res = UrlFetchApp.fetch(url,{
    'method': 'POST',
    'headers': {
      'Authorization': 'Bearer ' + accessToken,
    },
    'payload': JSON.stringify(body),
    'contentType': 'application/json',
    'muteHttpExceptions' : true,
  });

  console.log(res.getContentText());
}
```


<script src="https://gist.github.com/umehara0506/80767ed4b05f025ce57820033abc2480.js"></script>

次はクラスにしておこう。