GoogleスプレッドシートにGASでデータをインポートしてみた

# この記事でやること
Googleスプレッドシートでデータをimportするときにいろんなシートからimportされすぎて、重すぎてimportできないって経験ないですか？
（例）=IMPORTRANGE("**************","シート1!A:B")
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2586059/e1fea61c-3356-949f-315d-9911645dc0b7.png)
これをGASで無理やりimportできるようにしたいと思います
重たいという原因を直接解決してるわけじゃないし、リアルタイムで変更が反映できたりするものではないので、簡易的なものですが誰かの役に立てれたら嬉しいです！

# GAS
まず、インポート元のシートとそれを表示したいシートを用意します
表示したいシートを開いて、`拡張機能`→`Apps Script`からGASを開きます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2586059/b540b32a-237e-915c-7dd3-d4628ad4decc.png)
何かすでにGASが書いてある場合、壊すわけにいかないので一応新しいスクリプトを作ります
左上のファイルの横の＋マークです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2586059/da16394e-20ef-739f-24b1-c1bee67f212e.png)
スクリプトを選択して、適当な名前をつけといてください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2586059/050ae577-2d84-c57b-05e6-21c22396f455.png)
元々書いてあるコードは全て消して、以下のコードをコピペします
```js:script.js
// 参照元のid、name
let importsheetid = '1uTabkqI6vxpyOm_gXFzimSJBTL_miWS-hfnfBOmUcrM'
let importsheetname = '入会管理シート'
// 表示したいsheetのid、name
let sheetid = '1_FaOebZea3VBZRm_tMmvWreok6UNAr-o8aOKtUHIk2A'
let sheetname = '入会管理シート'
// 表示したいsheetの表示したい場所
// 何列目？？
let startrow = 3
// 何行目？？(Aが1、Bが2、Cが3みたいな感じです)
let startcol = 1

function importSheet() {
  const ss = SpreadsheetApp.openById(importsheetid).getSheetByName(importsheetname)
  const ssvalue = ss.getRange(1, 1, ss.getLastRow(), ss.getLastColumn()).getValues()
  const nowSheet = SpreadsheetApp.openById(sheetid).getSheetByName(sheetname)
  nowSheet.getRange(startrow, startcol, ssvalue.length, ssvalue[0].length).setValues(ssvalue)
}
```
**あとは先頭が`let`で始まってる行を変更すれば終わりです**
- シートidは、URLの`*`で書かれている部分を指します
`https://docs.google.com/spreadsheets/d/*******************/edit#gid=0`
- nameは、シートの名前をそのまま書けば大丈夫です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2586059/2da2cb1d-f9ea-3c76-2b4a-e4455e15266f.png)
- `startrow`と`startcol`は、importするときの始まりのセルを指します
`startrow=3, startcol=3`の時、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2586059/d77cdf4c-37fa-ab03-7a21-02e0c31e864d.png)
`startrow=4, startcol=1`の時、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2586059/f54b8210-9ced-907d-68d1-0f4cd6da905d.png)

<details><summary>一応コードの説明</summary><div>

#### 変数宣言について
jsには3つの変数宣言の方法があります
var, const, letです
varは現在はあまり使われていないようなので使っていなくて、
constは関数の中でしか使えないので、今回はなんとなく関数の外に変数をまとめときたかったので使っていません
letは再代入できたりするので一回設定したら再代入されることがないような今回の場合だと適切ではないのかもしれません
変数について詳しくは[こちら](https://techplay.jp/column/1619)など参考にすると理解できるかと思います

#### シートの参照
```js
const ss = SpreadsheetApp.openById(importsheetid).getSheetByName(importsheetname)
```
import元のシートを取得しています
```js
const ssvalue = ss.getRange(1, 1, ss.getLastRow(), ss.getLastColumn()).getValues()
```
取得したimport元のシートの全範囲を指定しています

`getRange`の4つの引数はそれぞれ
`(選択する最初の行番号<縦>, 選択する最初の列番号<横>, 選択範囲の行数<縦に並ぶセルの数>, 選択範囲の列数<横に並ぶセル数>)`
このように指定します
横の列数がアルファベットなのでわからなかったら、スプシ内で`=column()`とすると数字で何番目か表示できます
※import元の範囲を指定したかったらここで指定すれば変えれます
`getValues()`は指定した範囲のデータを2次元配列として取得できます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2586059/c9e573bb-51a1-dba1-2a82-35d5f6569556.png)
```js
[ [ 'a1', 'b1', 'c1', 'd1' ],
  [ 'a2', 'b2', 'c2', 'd2' ],
  [ 'a3', 'b3', 'c3', 'd3' ],
  [ 'a4', 'b4', 'c4', 'd4' ],
  [ 'a5', 'b5', 'c5', 'd5' ] ]
```

#### データの書き込み
```js
const nowSheet = SpreadsheetApp.openById(sheetid).getSheetByName(sheetname)
nowSheet.getRange(startrow, startcol, ssvalue.length, ssvalue[0].length).setValues(ssvalue)
```
1行目は先ほど同様シートの取得で、表示したいシートを取得しています
2行目も先ほどとほぼ一緒で、Rangeを指定しています
あとは`setValues()`でデータの書き込みをしています
</div></details>

# 保存と実行
コードの保存→`ctrl + s`
コードの実行→`ctrl + r`
実行するとうまく行っているとデータがインポートできているはずです

# トリガー設定
今のままだと、インポートしたくなった時にいちいちGASを開く必要があるので、トリガーを設定します
左の目覚まし時計みたいなマークをクリック![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2586059/77a9fba7-c9f6-62b2-aa5c-47083c0ab155.png)
- 右下のトリガーを追加
- 実行する関数→importSheet
- 時間主導型
- 1時間おきとかでまあまあ耐えるかと
    - シートの変更時とかでも良さそう
- 5分おきとかでもいいけど、ただでさえ重いのにもっと重くなる気がしますw
- 保存したら終了

# 注意点
この記事で書いていることはゴリ押しもゴリ押しです
根本的には何も解決してません
（シートが軽くなったわけではない、むしろ重くなると思われる）
トリガーで設定した時間ごとにしか更新されないので、瞬発力が大事な場面では使えないかもしれないです
もっといい方法ある方いたら教えて欲しいです〜〜
ばいちゃ