Google Apps Script (GAS) でスクレイピング~マスタから気象庁データのあるエリアごとに新しくスプレッドシートを作る実験

Others

こんにちは。1カ月とまた間が空きました。

前回のように画像だとわかりづらいかもしれない、と思ったので、Excel形式でダウンロードできるようにしてみました。

シートの方はざっくり2箇所変更済み。

・「data_2」に3行追加。ID、year、month。今回は「ID」を使っていきます。

・「col」シートの中身を全面入れ替え。前回のは「data_2」を作るための列リストで、今回は新規シートで記録していくための列リストです。
(入れ替えるのすっかり忘れてました。。。)

今回の機能追加はこちら。

・作ったシートのIDを取得し、「data_2」のID列に記入するようにする。

→作ったシートに対するコントロールを容易にするため。

・スクリプトをトリガーを使って回すだけで全地方のシートを作れるようにしてみた。

コード

var folderID="********************************";//ファイルを作りたいフォルダ(google drive)
function createSS(){
var bookurl_masterbook = https://docs.google.com/spreadsheets/d/”**********************************指定のマスタがあるファイル
var masterbook = SpreadsheetApp.openByUrl(bookurl_masterbook);
var sheet_master = masterbook.getSheetByName("data_2");//前回を継承してdata_2にしましたが、他の名前にした場合は変えてください
var sheet_col = masterbook.getSheetByName("col");
//ある列の最終行取得[D] http://www.relief.jp/docs/google-spreadsheet-gas-get-last-row-number-specified-column.html
var last_row = sheet_master.getLastRow();
var id_Arr = sheet_master.getRange(1,25,last_row,1).getValues(); //元のURL[D]にはないが、高速化を狙い一旦配列に入れてみる。
for(var i = last_row-1; i >= 0; i--){
if(id_Arr[i][0].toString() != ''){
var tgrow = i+2;
break;
}
}
if(tgrow > last_row){
return;
}
var textArr = sheet_master.getRange(tgrow,1,1,5).getValues();
var mCol = sheet_col.getRange(1,1,1,26).getValues();
var title=textArr[0][0]+"-"+textArr[0][3]+textArr[0][2]+"("+textArr[0][1]+":"+textArr[0][4]+")";
Logger.log(title);
//新しくスプレッドシートを作成する:https://qiita.com/tanaike/items/8c82392ef2749892061c
var ss = Drive.Files.insert({
"title": title,
"mimeType": "application/vnd.google-apps.spreadsheet",
"parents": [{"id": folderID}]
});
var book_new = SpreadsheetApp.openById(ss.id);
//シート名をすべて取得 https://www.wmapst.net/google/gss/20161207-google-spreadsheet-sheet-name-get/
var names_booknew = wmap_getSheetsName2(book_new);
//シート名を変更 http://nevernoteit1419.blogspot.jp/2012/01/blog-post_2201.html
var sheet_data=book_new.getSheetByName(names_booknew[0]);
sheet_data.setName("data");
sheet_data.getRange(1,1,1,26).setValues(mCol);
Logger.log(names_booknew);
SpreadsheetApp.setActiveSpreadsheet(book_new);
sheet_master.getRange(tgrow,25,1,1).setValue(ss.id);
}

実行すると、1エリア分できます。1000以上のエリアがあるので大変ですが、トリガーを使うことでGASは頑張って実行していってくれます。

最後に、このシートのスクリプトから、作ったエリアシートに天気データを記入していくコードができれば完成ですね。

function getweatherdata(area,type,year,month) みたいに、引数入れたらデータが返ってくるように作ると使い勝手がよさそうです。

コメント