この記事では、GAS(Google Apps Script)で「ねこあつめ」をChatworkに送信する時に、配列の取り扱いに慣れて行くことが出来るプログラムの作成を目的としています。
お世話になった記事は、いつも隣にITのお仕事さんの
【初心者向けGAS】スプレッドシートのセル範囲の値を二次元配列として取得して取り扱う方法
です。
今回の内容に入る前に、前回とそれ以前の復習をします。
前回はChatworkを使う際、APIトークンを別領域に格納するのに、プロパティストアを使いました。
また、今までは、下記のようなスプレッドシートを使って、猫ちゃんの名前をChatworkに書き出して、1番右の列を「済」にしてきました。
前回のコードです。
//メインの関数でAmazonにDVDの注文をする
function myFunction() {
const ss = SpreadsheetApp.getActiveSheet();
let lastRow = ss.getLastRow();//最終行を取得
const token=PropertiesService.getScriptProperties().getProperty('CW_TOKEN');//←ここを追加
for (let i = 2; i <= lastRow; i++) {
//もしもD列の「済」が空白だったらA列の「なまえ」を出力してD列を「済」にする
if (!ss.getRange(i, 4).getValue()) {
//AmazonがDVDの注文を受け取る
const body=ss.getRange(i, 1).getValue();
//ここでAmazonが宅配業者みたいなsendMessage関数にDVDの配達を依頼する
sendMessage(token,body); //←ここに引数tokenを追加する
ss.getRange(i, 4).setValue('済');
//もしも最終行以上になったらセル範囲を消去する
if (i >= lastRow) {
ss.getRange(2, 4, lastRow - 1).clearContent();
}
break;
}
}
}
//宅配業者のようなsendMessage関数がAmazonからDVDを受け取って、配達を行う
function sendMessage(token,body){ //←ここの引数にtokenを加える
const cw=ChatWorkClient.factory({token:token}); //←APIトークンの所をtokenに置き換える
cw.sendMessageToMyChat(body);
}
今回の内容に入る前に、ねこあつめ画像で癒されます。
さて、今回の内容に入ります。
これまでA列の猫ちゃんの名前を送ってきましたが、B列の「しゅるい」とC列の「とくちょう」は何もしませんでした。
そこで今回はB列、C列も出力して行きます。
13行目のA列の猫ちゃんの名前を格納したbodyの所を変更して、B列やC列のデータも入れるようにします。
下記のコードの13行目から16行目までを追加変更しました。
//メインの関数でAmazonにDVDの注文をする
function myFunction() {
const ss = SpreadsheetApp.getActiveSheet();
let lastRow = ss.getLastRow();//最終行を取得
const token=PropertiesService.getScriptProperties().getProperty('CW_TOKEN');//←ここを追加
for (let i = 2; i <= lastRow; i++) {
//もしもD列の「済」が空白だったらA列の「なまえ」を出力してD列を「済」にする
if (!ss.getRange(i, 4).getValue()) {
//AmazonがDVDの注文を受け取る
let body=""; //←ここで、bodyにA列、B列、C列のデータを追加していくので、bodyをletで変数として宣言
body+=ss.getRange(i,1).getValue()+'\n';
body+=ss.getRange(i,2).getValue()+'\n';
body+=ss.getRange(i,3).getValue()+'\n';
//ここでAmazonが宅配業者みたいなsendMessage関数にDVDの配達を依頼する
sendMessage(token,body);
ss.getRange(i, 4).setValue('済');
//もしも最終行以上になったらセル範囲を消去する
if (i >= lastRow) {
ss.getRange(2, 4, lastRow - 1).clearContent();
}
break;
}
}
}
//宅配業者のようなsendMessage関数がAmazonからDVDを受け取って、配達を行う
function sendMessage(token,body){
const cw=ChatWorkClient.factory({token:token}); //←APIトークンの所をtokenに置き換える
cw.sendMessageToMyChat(body);
}
このコードを実行することで、A列からC列まで出力されています。
猫ちゃんたちの名前とともに種類や特徴がわかりますね。
ただ、ループでA列、B列、C列のセルを一つ一つ計3回アクセスして取得して、それを4匹分取得すると3×4で12回のアクセスの手間がかかってしまうんです・・・。
なので、配列を使うと便利です。
今回はcatという配列を使います。
下記コードの11行目で配列catを使って、1行3列分一気に格納しますので、getValuesと最後に「s」がついて複数形になっています。
また、スプレッドシートは二次元配列で扱うので、14行目〜16行目のcat[0][0]がA列の「なまえ」、cat[0][1]がB列の「しゅるい」、cat[0][2]がC列の「とくちょう」になっています。
配列は0か始まるので、cat[0]はcatという配列の1行目という意味です。
ループの中でcatには次の猫ちゃんの名前が入るので、配列catの1行目に次々と猫ちゃんデータが格納されるイメージです。
//メインの関数でAmazonにDVDの注文をする
function myFunction() {
const ss = SpreadsheetApp.getActiveSheet();
let lastRow = ss.getLastRow();//最終行を取得
const token=PropertiesService.getScriptProperties().getProperty('CW_TOKEN');//←ここを追加
for (let i = 2; i <= lastRow; i++) {
//もしもD列の「済」が空白だったらA列の「なまえ」を出力してD列を「済」にする
if (!ss.getRange(i, 4).getValue()) {
let cat=ss.getRange(i,1,1,3).getValues();//←配列catで一気に1行3列分のデータを取得する ※getValue[s]でsが付く
//AmazonがDVDの注文を受け取る
let body=""; //←ここで、bodyにA列、B列、C列のデータを追加していくので、bodyをletで変数として宣言
body+=cat[0][0]+'\n';//A列:猫ちゃんの「なまえ」
body+=cat[0][1]+'\n';//B列:猫ちゃんの「しゅるい」
body+=cat[0][2]+'\n';//C列:猫ちゃんの「とくちょう」
//ここでAmazonが宅配業者みたいなsendMessage関数にDVDの配達を依頼する
sendMessage(token,body);
ss.getRange(i, 4).setValue('済');
//もしも最終行以上になったらセル範囲を消去する
if (i >= lastRow) {
ss.getRange(2, 4, lastRow - 1).clearContent();
}
break;
}
}
}
//宅配業者のようなsendMessage関数がAmazonからDVDを受け取って、配達を行う
function sendMessage(token,body){
const cw=ChatWorkClient.factory({token:token}); //←APIトークンの所をtokenに置き換える
cw.sendMessageToMyChat(body);
}
配列を使うことによって、各回3回分のアクセスを1回(11行目)に減らせました。
なので、今まで各回3×4=12回だったのが、配列catを用いることで、各回1×4=4回のスプレッドシートのアクセスに減らせました。
ご精読ありがとうございました。
■参考文献の紹介■
初めてGASを学ぶ方向け。
スプレッドシートの基本的な使い方からGASのベースとなるJavaScriptの基礎文法、GASでの初歩的なプログラミングを学べます。
GASに少し慣れて来たら、基礎固めとリファレンスとしてこの本を通してじっくり学べます。