この記事では、GAS(Google Apps Script)で「ねこあつめ」を一定時間間隔にChatworkに送信した時に使ったAPIトークンをプロパティストアと言うもので管理して、別領域に格納することを実践致します。
お世話になった記事は、いつも隣にITのお仕事さんの
【初心者向けGAS】プロパティストアの概要とスクリプトプロパティの入力方法
と、
【初心者向けGAS】スクリプトプロパティを操作してそのデータを取り出す方法
です。
今回の内容に入る前に、前回の復習をします。
1分置きにねこあつめの猫ちゃんの名前を送る「トリガー」を使いました。エディターの「目覚まし時計マーク」を押して、トリガーを設定しました。
Chatworkに実際に送られたメッセージです。
このメッセージの元になっているのが、下記のスプレッドシートで、これらのコードはこのスプレッドシートにバインドして書いていっています。
今回の内容に入る前に、ねこあつめ画像で癒されます。
さて、今回の内容に入ります。今まで、Chatworkに送る時に、
token:’XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX’の所に、ChatworkのマイチャットのAPIトークンをそのまま打っていました。
この’XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX’の所を別の領域に格納する為に、「プロパティストア」を使います。
‘XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX’の代わりに例えば’CW_TOKEN’などの文字列を使って処理を施すことが可能になります。
そうすることによって、APIトークンをネットで晒すことを防げます。
//ChatworkのAPIトークンをCW_TOKENに格納
function setScriptPropaty(){
PropertiesService.getScriptProperties().setProperty('CW_TOKEN','XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX');
}
このコードで、’XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX’を’CW_TOKEN’として扱うことが出来ます。
実行結果は、このように、何も実行されていません。
確認のため、下記のコードで’CW_TOKEN’に’XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX’が格納されていることがログ出力致します。
//プロパティストアを使ってCW_TOKENにAPIトークンが格納されたことを確認する
function logToken(){
const token=PropertiesService.getScriptProperties().getProperty('CW_TOKEN');
console.log(token);
}
この、モザイクの所に、APIトークンが入っています。
では、今まで作ってきたこのコードに修正を致します。
これまでのコードです。
//メインの関数でAmazonにDVDの注文をする
function myFunction() {
const ss = SpreadsheetApp.getActiveSheet();
let lastRow = ss.getLastRow();//最終行を取得
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(body);
ss.getRange(i, 4).setValue('済');
//もしも最終行以上になったらセル範囲を消去する
if (i >= lastRow) {
ss.getRange(2, 4, lastRow - 1).clearContent();
}
break;
}
}
}
//宅配業者のようなsendMessage関数がAmazonからDVDを受け取って、配達を行う
function sendMessage(body){
const cw=ChatWorkClient.factory({token:'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'});
cw.sendMessageToMyChat(body);
}
4行目の「let lastRow = ss.getLastRow();//最終行を取得」の後に
const token = PropertiesService.getScriptProperties().getProperty(‘CW_TOKEN’);
を加えます。最後の’CW_TOKEN’の所に’XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX’が入っています。
それらを定数tokenに代入しています。
宅配業者のようなsendMeessageの呼び出しの所に、bodyの前にtokenを加えて、呼び出した先の仮引数にも加えています。
メイン関数の引数を、「DVDを渡すもの」だとしたら、宅配業者の様なsendMessage関数の仮引数は「DVDを受け取るもの」というイメージだとプログラムの流れが掴みやすいと思います。
また、29行目の所の’XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX’を「token」で置き換えています。
下記のコードで、追記変更した所に「←コメント」を追加しています。
//メインの関数で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);
}
APIトークンの’XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX’を晒すこと無く、今までと同様に動作します。
ご精読ありがとうございました。
■参考文献の紹介■
初めてGASを学ぶ方向け。
スプレッドシートの基本的な使い方からGASのベースとなるJavaScriptの基礎文法、GASでの初歩的なプログラミングを学べます。
GASに少し慣れて来たら、基礎固めとリファレンスとしてこの本を通してじっくり学べます。