【はじめに】GAS(Google Apps Script)でスプレッドシートAからBに文字を転記できるようになるまで
【基礎編】GAS(Google Apps Script)でスプレッドシートAからBに文字を転記できるようになるまで
【応用編】GAS(Google Apps Script)でスプレッドシートAからBに文字を転記できるようになるまで
2回目の今回は【基礎編】として、比較的簡単な方法を紹介します。
簡単だけど、何百行もあるスプレッドシートなど大量のデータ処理には向いてません。初めての方は練習と思って、ちょっとした転記から試してみるのもいいかもしれませんね。
「わかんない」「めんどくさい」という方はココナラでまるごと注文して作ってもらいましょう。平均予算3,000円〜5,000円くらい。作るモノにもよると思いますが。
転記用のGASコードとその解説
では早速、スプレッドシートAの文字列から、文字列”D”だけを選んで、スプレッドシートBに転記してみましょう。以下のようなコードになります。
//【スプレッドシートBのプロジェクト】
//getRange(行番号,列番号)で、スプレッドシートAからスプレッドシートBに転記する場合
function R1C1_Function() {
//スプレッドシートAのシート1を取得
const spreadsheetA = SpreadsheetApp.openById('※※スプレッドシートAのID※※')
const sheet1ofA = spreadsheetA.getSheetByName('シート1');
const last_row_A = sheet1ofA.getLastRow()
//スプレッドシートBのシート1を取得
const spreadsheetB = SpreadsheetApp.getActiveSpreadsheet();
const sheet1ofB = spreadsheetB.getSheetByName('シート1');
for(let i = 1;i <= last_row_A; i++){//行番号(初期値は「1」)
let alphabet = sheet1ofA.getRange(i,1).getValue(); //スプレッドシートAの1列目を取得
if(alphabet == "D"){ //Dだけを探して
let last_row_B = sheet1ofB.getLastRow(); //スプレッドシートBの最終行に
sheet1ofB.getRange(last_row_B + 1,1).setValue(alphabet); //転記する
}
}
}
それぞれの行を解説していきます。まずはいちばん上のこちらから。
const spreadsheetA = SpreadsheetApp.openById('※※スプレッドシートAのID※※')
スプレッドシートBのプロジェクトから、スプレッドシートAの情報を取得します。
別のスプレッドシートを指定して取得する時は、そのスプレッドシートのIDを指定する必要があります。
IDとは何か? どうやったらわかるのか?
ためしにスプレッドシートAのURLをよく見てみてください。
https://docs.google.com/spreadsheets/d/※※スプレッドシートAのID※※/edit?pli=1#gid=xxxxxxxxxxxxxx
こんな感じになっているはず。この「/spreadsheets/d/」と「/edit?pli=1#gid=」に挟まれた文字列がIDです。この文字列を”で囲ってopenById(‘※※スプレッドシートAのID※※’)に入れるようにしましょう。これでスプレッドシートA全体を取得できます。
const sheet1ofA = spreadsheetA.getSheetByName('シート1');
次の行で、スプレッドシートAのなかから、「シート1」という名前のシートをgetSheetByNameという方法で取得しています。
const last_row_A = sheet1ofA.getLastRow();
ここではgetLastRowという方法で最終行、つまり、「いちばん下の文字が入っている行の数」を取得しています。
例えば今回、スプレッドシートAのシート1は8行まで文字が入っているので、last_row_Aは「8」になるはずです。ここで取得した値は後に役立ちます。
続いて、スプレッドシートBのシート1の内容を同じように取得します。
//スプレッドシートBのシート1を取得
const spreadsheetB = SpreadsheetApp.getActiveSpreadsheet();
const sheet1ofB = spreadsheetB.getSheetByName('シート1');
こちらはIDは必要ありません。今回はスプレッドシートBのプロジェクトでスプレッドシートBを取得してるからです。
こうしてスプレッドシートAとB、両方の情報を取得したところで、いよいよ転記の作業がはじまります。
for(let i = 1;i <= last_row_A; i++){
この部分はfor文といって、繰り返しの作業をする時に使います。それぞれの項目は。
for( 初期値(どこから) ; 最大値(どこまで) ; 増減値(どれだけ増やすかor減らすか)){
という意味ですから、今回の場合でいうと、
for(let i = 1;i <= last_row_A; i++){
//初期値は「1」、最大値はlast_row_Aつまり「スプレッドシートAの最終行」、増減値は1ずつ増える
//もっとわかりやすくいうと
//「スプレッドシートAシート1の1から最終行(8行)まで1ずつ増える数」
ということになります。
let alphabet = sheet1ofA.getRange(i,1).getValue(); //スプレッドシートAの1列目を取得
これは、スプレッドシートAの1列目をfor文で繰り返し取得する部分です。getRange(行番号,列番号)になるので、行iは「1から最終行(8行)まで」をfor文で繰り返します。列は1列目なので「1」で固定します。
こうして「1行目の1列目」「2行目の1列目」「3行目の1列目」…と取得していったセルの中身を、次の4行で検証します。
if(alphabet == "D"){ //Dだけを探して
let last_row_B = sheet1ofB.getLastRow(); //スプレッドシートBの最終行に
sheet1ofB.getRange(last_row_B + 1,1).setValue(alphabet); //転記する
}
if文を使って、alphabet(取得したセルの中身)がDであるかどうかを判定しています。AとかBとかCとかFならスルーします。
もしもDであったら、スプレッドシートBの最終行に転記します。
let last_row_B = sheet1ofB.getLastRow();
ここで最終行を取得しています。last_row_Aの時と同じ方法ですね。
なんで、last_row_A(スプレッドシートAの最終行)がだいぶ前に取得していたのに、このタイミングでlast_row_B(スプレッドシートBの最終行)を取得しているのか?
それは、Bの最終行が転記されるごとに1ずつ増えていくからです。そのたびに最終行がいくつか数え直しています。
sheet1ofB.getRange(last_row_B + 1,1).setValue(alphabet);
スプレッドシートBのシート1、1列目の最終行に、スプレッドシートAで取得した値(D)をsetValueで入力しています。
スプレッドシートBを開いてみましょう。ちゃんと転記できていたら成功です。
コメント