前提
基本的なGASの使い方やスクリプトエディタの使い方はわかっている方を対象にしています。
背景
Webマーケティングに使用するSEO対策用の複合キーワードを作成するために、カテゴリ1,カテゴリ2のそれぞれのキーワードを組み合わせたキーワードを生成する必要があった。
今までPHPで書いてCSVで出力していたが、そもそもGASでかけばいいのでは?と今更思ったので、調べてみた。
コード
前提としてそれぞれのシートにはA列のみに取得する文字列が並んでいる状態です。
sample.js
function myFunction() {
var sheet1 = SpreadsheetApp.getActive().getSheetByName('category1');
var sheet2 = SpreadsheetApp.getActive().getSheetByName('category2');
var sheet_output = SpreadsheetApp.getActive().getSheetByName('output');
var last_row_sheet1 = sheet1.getLastRow();
var last_row_sheet2 = sheet2.getLastRow();
var cats1 = sheet1.getRange(1, 1, last_row_sheet1, 1).getValues();
var cats2 = sheet2.getRange(1, 1, last_row_sheet2, 1).getValues();
var row_kw = 1;
for(i = 0; i < last_row_sheet1; i++) {
for(j = 0; j < last_row_sheet2; j++) {
var kw = cats1[i] + " " + cats2[j]
sheet_output.getRange(sheet_output, 1).setValue(kw);
row_kw++;
}
}
}
はい、めちゃめちゃ簡単でした。
流れとしては
- シートを取得
- シートごとに列の値を取得
- 組み合わせたワードを出力先に書き込み
という基本的な流れです。
シート取得するところが
SpreadsheetApp.getActive().getSheetByName(sheet_name);
ということさえわかればあとは直感的にかけますね。
パフォーマンス的にもgetValues()
を使うべし
なお、最初getRange.getValue()
で値を取得する部分をループしていたら、
行数が数百行あったこともあり、起動時間が長すぎたようで強制終了してしまった。
DBへのアクセスと同様に、ループの中で接続したらダメですね。
getValues()
先に値を全部とってきてから、その配列をループで回して作りたい文字列を生成するようにしましょう。
パフォーマンスへの影響も顕著で、getRange.getValue()
のときは1sで5行ずつしか生成されていなかったが、getRange.getValues()
のときはほぼ一瞬で終わった。