LoginSignup
0
0

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

Posted at

この記事でやること

Googleスプレッドシートでデータをimportするときにいろんなシートからimportされすぎて、重すぎてimportできないって経験ないですか?
(例)=IMPORTRANGE("**************","シート1!A:B")
image.png
これをGASで無理やりimportできるようにしたいと思います
重たいという原因を直接解決してるわけじゃないし、リアルタイムで変更が反映できたりするものではないので、簡易的なものですが誰かの役に立てれたら嬉しいです!

GAS

まず、インポート元のシートとそれを表示したいシートを用意します
表示したいシートを開いて、拡張機能Apps ScriptからGASを開きます
image.png
何かすでにGASが書いてある場合、壊すわけにいかないので一応新しいスクリプトを作ります
左上のファイルの横の+マークです
image.png
スクリプトを選択して、適当な名前をつけといてください
image.png
元々書いてあるコードは全て消して、以下のコードをコピペします

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
  • startrowstartcolは、importするときの始まりのセルを指します
    startrow=3, startcol=3の時、
    image.png
    startrow=4, startcol=1の時、
    image.png
一応コードの説明

変数宣言について

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

シートの参照

const ss = SpreadsheetApp.openById(importsheetid).getSheetByName(importsheetname)

import元のシートを取得しています

const ssvalue = ss.getRange(1, 1, ss.getLastRow(), ss.getLastColumn()).getValues()

取得したimport元のシートの全範囲を指定しています

getRangeの4つの引数はそれぞれ
(選択する最初の行番号<縦>, 選択する最初の列番号<横>, 選択範囲の行数<縦に並ぶセルの数>, 選択範囲の列数<横に並ぶセル数>)
このように指定します
横の列数がアルファベットなのでわからなかったら、スプシ内で=column()とすると数字で何番目か表示できます
※import元の範囲を指定したかったらここで指定すれば変えれます
getValues()は指定した範囲のデータを2次元配列として取得できます
image.png

[ [ 'a1', 'b1', 'c1', 'd1' ],
  [ 'a2', 'b2', 'c2', 'd2' ],
  [ 'a3', 'b3', 'c3', 'd3' ],
  [ 'a4', 'b4', 'c4', 'd4' ],
  [ 'a5', 'b5', 'c5', 'd5' ] ]

データの書き込み

const nowSheet = SpreadsheetApp.openById(sheetid).getSheetByName(sheetname)
nowSheet.getRange(startrow, startcol, ssvalue.length, ssvalue[0].length).setValues(ssvalue)

1行目は先ほど同様シートの取得で、表示したいシートを取得しています
2行目も先ほどとほぼ一緒で、Rangeを指定しています
あとはsetValues()でデータの書き込みをしています

保存と実行

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

トリガー設定

今のままだと、インポートしたくなった時にいちいちGASを開く必要があるので、トリガーを設定します
左の目覚まし時計みたいなマークをクリックimage.png

  • 右下のトリガーを追加
  • 実行する関数→importSheet
  • 時間主導型
  • 1時間おきとかでまあまあ耐えるかと
    • シートの変更時とかでも良さそう
  • 5分おきとかでもいいけど、ただでさえ重いのにもっと重くなる気がしますw
  • 保存したら終了

注意点

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

0
0
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
0
0