質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

解決済

2回答

1699閲覧

GASの高速化を測りたいが、方法が思いつきません

tatsu3

総合スコア11

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

0グッド

0クリップ

投稿2019/11/17 13:00

気象庁がWEBで提供するCSVファイルをGoogleAppsScriptでスクレイピングしてスプレッドシートに反映する仕組みを、本サイトでご助言も頂きながら構築中です。全国データから北海道分を抜き出して、スプレッドシートに出力する仕組みです。

下のようなコードを書いてみましたが、一回の処理に20秒以上かかります。同じ処理を繰り返しているので、仕方ないのでしょうか。

タイムアウトになることはないので、このままでも構わないのですが、高速化する方法が何か考えられるなら、ご教唆頂けると幸いです。

GoogleAppsScript

1 2spreadsheet = null; 3sheetMap = []; 4 5function auto_csv() { 6 7 //★1時間降水量 8 var url_1h = "https://www.data.jma.go.jp/obd/stats/data/mdrr/pre_rct/alltable/pre1h00_rct.csv"; 9 var response_1h = UrlFetchApp.fetch(url_1h); 10 var data_1h = response_1h.getContentText("Shift_JIS"); 11 var sheet_1h = _getSheetByName("Rain1h"); 12 var csv_1h = Utilities.parseCsv(data_1h); 13 var result_1h = csv_1h.filter(function(value){ 14 if(value[1].indexOf('北海道')!==-1){ 15 return value 16 }}); 17 sheet_1h.getRange(2, 1, result_1h.length, result_1h[0].length).setValues(result_1h); 18 19 //★3時間降水量 20 var url_3h = "https://www.data.jma.go.jp/obd/stats/data/mdrr/pre_rct/alltable/pre3h00_rct.csv"; 21 var response_3h = UrlFetchApp.fetch(url_3h); 22 var data_3h = response_3h.getContentText("Shift_JIS"); 23 var sheet_3h = _getSheetByName("Rain3h"); 24 var csv_3h = Utilities.parseCsv(data_3h); 25 var result_3h = csv_3h.filter(function(value){ 26 if(value[1].indexOf('北海道')!==-1){ 27 return value 28 }}); 29 sheet_3h.getRange(2, 1, result_3h.length, result_3h[0].length).setValues(result_3h); 30 31 //★6時間降水量 32 var url_6h = "https://www.data.jma.go.jp/obd/stats/data/mdrr/pre_rct/alltable/pre6h00_rct.csv"; 33 var response_6h = UrlFetchApp.fetch(url_6h); 34 var data_6h = response_6h.getContentText("Shift_JIS"); 35 var sheet_6h = _getSheetByName("Rain6h"); 36 var csv_6h = Utilities.parseCsv(data_6h); 37 var result_6h = csv_6h.filter(function(value){ 38 if(value[1].indexOf('北海道')!==-1){ 39 return value 40 }}); 41 sheet_6h.getRange(2, 1, result_6h.length, result_6h[0].length).setValues(result_6h); 42 43 //★12時間降水量 44 var url_12h = "https://www.data.jma.go.jp/obd/stats/data/mdrr/pre_rct/alltable/pre12h00_rct.csv"; 45 var response_12h = UrlFetchApp.fetch(url_12h); 46 var data_12h = response_12h.getContentText("Shift_JIS"); 47 var sheet_12h = _getSheetByName("Rain12h"); 48 var csv_12h = Utilities.parseCsv(data_12h); 49 var result_12h = csv_6h.filter(function(value){ 50 if(value[1].indexOf('北海道')!==-1){ 51 return value 52 }}); 53 sheet_12h.getRange(2, 1, result_12h.length, result_12h[0].length).setValues(result_12h); 54 55 //★24時間降水量 56 var url_24h = "https://www.data.jma.go.jp/obd/stats/data/mdrr/pre_rct/alltable/pre24h00_rct.csv"; 57 var response_24h = UrlFetchApp.fetch(url_24h); 58 var data_24h = response_24h.getContentText("Shift_JIS"); 59 var sheet_24h = _getSheetByName("Rain24h"); 60 var csv_24h = Utilities.parseCsv(data_24h); 61 var result_24h = csv_24h.filter(function(value){ 62 if(value[1].indexOf('北海道')!==-1){ 63 return value 64 }}); 65 sheet_24h.getRange(2, 1, result_24h.length, result_24h[0].length).setValues(result_24h); 66 67 //★48時間降水量 68 var url_48h = "https://www.data.jma.go.jp/obd/stats/data/mdrr/pre_rct/alltable/pre48h00_rct.csv"; 69 var response_48h = UrlFetchApp.fetch(url_48h); 70 var data_48h = response_48h.getContentText("Shift_JIS"); 71 var sheet_48h = _getSheetByName("Rain48h"); 72 var csv_48h = Utilities.parseCsv(data_48h); 73 var result_48h = csv_48h.filter(function(value){ 74 if(value[1].indexOf('北海道')!==-1){ 75 return value 76 }}); 77 sheet_48h.getRange(2, 1, result_24h.length, result_24h[0].length).setValues(result_24h); 78 79 //★72時間降水量 80 var url_72h = "https://www.data.jma.go.jp/obd/stats/data/mdrr/pre_rct/alltable/pre72h00_rct.csv"; 81 var response_72h = UrlFetchApp.fetch(url_72h); 82 var data_72h = response_72h.getContentText("Shift_JIS"); 83 var sheet_72h = _getSheetByName("Rain72h"); 84 var csv_72h = Utilities.parseCsv(data_72h); 85 var result_72h = csv_72h.filter(function(value){ 86 if(value[1].indexOf('北海道')!==-1){ 87 return value 88 }}); 89 sheet_72h.getRange(2, 1, result_72h.length, result_72h[0].length).setValues(result_72h); 90} 91 92//第2関数 93function _getSpreadSheet(){ 94 if ( ! spreadsheet) { 95 spreadsheet = SpreadsheetApp.getActive(); 96 } 97 return spreadsheet; 98 } 99 100//第3関数 101function _getSheetByName(name){ 102 if ( ! sheetMap[name]) { 103 sheetMap[name] = _getSpreadSheet().getSheetByName(name); 104 } 105 return sheetMap[name]; 106 } 107

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kyoya0819

2019/11/17 13:17

処理以前にダウンロードにはどのくらいの時間がかかってますか?
tatsu3

2019/11/17 14:10

正確な時間を測る知識がないので、(お恥ずかしながら)原始的にPC画面を動画で撮って、大まかな時間を確かめてみたのですが、7枚のシート全てにデータが出力されるまで、およそ16秒くらいでした。 初心者ですので教えて頂きたいのですが、実行ボタンを押すと上部に出る「Preparing for execution 」→「Running Function...」の表示が消えるまでが、処理時間という考え方でいいのでしょうか? 今、何回か試して気付いたのですが、昨日時間を測ったときは、「Preparing....」が表示される時間が結構長い場合が多くてイライラしました。ですが、今日はそれほどでもない感じがします。昨日は職場のPCで、本日は自宅のPCで試しています。PCの性能やネット環境などによって処理時間、出力時間が変わることもありえるのでしょうか。
kyoya0819

2019/11/17 14:15

変わらないと断言はできないです。 実際、わたしの家と家の外のプログラミング環境(4Gじゃなくて勤め先みたいな意味合い)では体感速度全然違いますし、家の外のプログラミング環境でも最大で接続数は500機器前後時間によって変わってしまうのでそれによって速度はかなり変わります。あとは、無線通信だとWifiの規格だったり有線でも聞きやケーブルの規格によって変わることは多々あります。
tatsu3

2019/11/17 14:25

ありがとうごさいます。そういうものなんですね。 そもそも15〜20秒の処理(出力)時間で「遅い」と思うのが適当ではないのでしょうかね? 同じ処理をくりかえしているので、素人ながら、どこかに効率化の余地があるのでは?と詮索してみたのですが。 違うWEBデータを違うシートに出力するので、やはり仕方ないのでしょうか。
guest

回答2

0

すでに解決済みですが、思いつきを書いてみます。

UrlFetchApp.fetch()の呼び出しは並列化しても問題なさそうなので、UrlFetchApp.fetchAll()に変えるといいかもしれません。
こちらを読むとUrlFetchApp.fetchAll()は並列処理されるようなのでfetchがボトルネックなら高速化が期待できます。

投稿2019/11/17 18:30

編集2019/11/17 18:32
draq

総合スコア2573

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tatsu3

2019/11/18 08:39

どうもありがとうございました。UrlFetchApp.fetchAll。初めて知りました。ぜひ勉強してみます。取り急ぎお礼申し上げます。
guest

0

ベストアンサー

冗長な記述はありますが、特別時間がかかるような処理はなさそうに見えます。
スクレイピング先がデータ生成(呼び出し?)するのに相当の時間がかかってるんじゃないでしょうか。
それならこちら側ではどうしようもないということになろうかと思います

ブラウザでその7枚の画面を表示するのにどれぐらいの時間かかるのかを見れば、処理時間が妥当なものかはわかるかと思いますが。

投稿2019/11/17 14:20

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tatsu3

2019/11/17 14:40

「特別時間がかかるような処理はなさそう」と言って頂き、納得しました。許容範囲と考えるべきですね。どうもありがとうございました。 追加質問をして下さった方にも感謝申し上げます。 また宜しくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問