teratail header banner
teratail header banner
質問するログイン新規登録
Google Apps Script

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

Q&A

解決済

1回答

4003閲覧

【GAS】複数リンクをクリックして、指定フォルダーにダウンロードする方法

w_k31

総合スコア13

Google Apps Script

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

0グッド

1クリップ

投稿2019/07/05 02:57

編集2019/07/06 03:48

0

1

実現したいこと

複数URLをまとめてクリックして、指定フォルダーにCSVをダウンロードがしたいです。
さらに欲を言えば、落とした複数のCSVファイルを一つのCSVファイルにまとめれたら尚良いです。(文字コード:UTF-8)
また、ローカルに開発環境が無いため、GASで処理をしたいと考えています。

イメージ図

B2   C2
企業A https://○○○
企業B https://□□□
企業C https://△△△
企業D https://×××

→C列にある複数リンクを取得していく感じになります。

従来の方法

マクロを組み、対応していましたが、URLの数が増えて時間が掛かるためです。

宜しくお願いします!

各URLはCSVファイルへの直リンクということですか?
直リンクになります。

CSVファイルを纏めるということは、各CSVファイルの列数及び形式はすべて同じという前提ですか?
同じです!異なるのは企業名とデータの値です。

表示回数クリック数
企業A123410

上記のようなものになります。

保存先は利用者のグーグルドライブないのルートフォルダでいいのですか?
はい!それで大丈夫です!

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

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

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

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

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

hiroshi0240

2019/07/05 04:53

各URLはCSVファイルへの直リンクということですか?
hiroshi0240

2019/07/05 04:54

CSVファイルを纏めるということは、各CSVファイルの列数及び形式はすべて同じという前提ですか?
hiroshi0240

2019/07/05 04:55

保存先は利用者のグーグルドライブないのルートフォルダでいいのですか?
w_k31

2019/07/05 05:28

>>hiroshi0240さん 回答を追記しました!宜しくお願いします。
papinianus

2019/07/06 02:07

デスクトップには配信できません
w_k31

2019/07/06 03:50

>>papinianusさん そうなんですね…。グーグルドライブであれば可能でしょうか?
hiroshi0240

2019/07/06 07:59

で、どこまで出来て、どの辺りがわからないのでしょうか?動作に必要な各メソッドが知りたいということで良いですか?
w_k31

2019/07/06 08:36

>>hiroshi0240さん まだ何も着手出来ておりません。出来れば、完成品が欲しい所ですが、これを機にGASの勉強を考えてますので、動作に必要な各メソッドを教えてほしいです。宜しくお願いします。
guest

回答1

0

ベストアンサー

CSVデータの取得はこちらが参考になると思います。リンク内容
後は、取得したデータを順にスプレッドシートにでも入力してまとまったものをcsvで吐き出して、スプレッドシートはゴミ箱に入れてしまえば良いかと

投稿2019/07/06 08:57

hiroshi0240

総合スコア640

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

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

w_k31

2019/07/06 10:31

試しに一つURLを該当箇所に入れて、実行すると自分が思ってる形で出力されました!(文字コードもUTF-8でした)リンクが70個ほどあるのですが、配列に入れて対応するのでしょうか?
hiroshi0240

2019/07/06 11:12

おっしゃるように配列に入れて繰り返し処理するのが良いと思います。
w_k31

2019/07/06 13:34

試しに2つのURLで処理をしてみたのですが、 var URLS = [ "https://da6919f97b0257", "https://55fd34d4efade81" ]; for (var i = 0; i < 2; i++){ var responses = UrlFetchApp.fetch(URLS[i]); } var data = responses.getContentText(); var csv = Utilities.parseCsv(data); var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); var sheet = spreadsheet.getSheetByName("csv"); sheet.getRange(1, 1, csv.length, csv[0].length).setValues(csv); } これだと、2つ目のみしか出力されなかったです。 どこで間違っているのでしょうか。 教えて頂ければと思います。 宜しくお願いします。
hiroshi0240

2019/07/06 15:43

繰り返しの中で毎回1行目から書き込んでるので、データを上書きしています。 Last row+1から追記するようにしてください
hiroshi0240

2019/07/06 15:56

あと、多分試しだから直接配列を作っているだと思いますが、スプレッドシート等で1列分纏めてgetValuesでとってくれば2次元配列で格納できますよ
w_k31

2019/07/06 17:07

やはり上書きをしていたのですね...。Last rowを定義して、+1すれば値をセット出来るのでしょうか?色々やってるのですが、何も落ちなくなってしまいました。教えて頂けないでしょうか? 2次元配列については、これが解決したら、やってみようと思います!
hiroshi0240

2019/07/07 00:40

var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); var sheet = spreadsheet.getSheetByName("csv"); この部分はfor文の前に定義しておいて下さい。その上で、for文の初めに、var lastrow = sheet.getLastRow();を定義して、追記場所指定のgetRangeの最初の1の部分の代わりに、lastrow+1を入れれば良いです
w_k31

2019/07/07 03:29 編集

処理を実行したら、常に最終行の+1で処理されました!凄いです! ただ、落ちてくるデータが2つ目のCSVだけでした。 ーーーーーーーーー var URLS = [ "https://ads.ind105d54d6b81d0257", "https://ads.in8361533d4d4efade81" ]; var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); var sheet = spreadsheet.getSheetByName("csv"); var lastrow = sheet.getLastRow(); for (var i = 0; i < 2; i++){ var responses = UrlFetchApp.fetch(URLS[i]); } var data = responses.getContentText(); var csv = Utilities.parseCsv(data); sheet.getRange(lastrow+1, 1, csv.length, csv[0].length).setValues(csv); ーーーーーーーーー 本当に何度もすみません。 1つ目も一緒に出力するにはどこを直せば良いのでしょうか? 宜しくお願いします。
hiroshi0240

2019/07/07 04:59

forの繰り返しがデータを取るところまでで終わってしまっています。 追記が終わってから}を閉じて下さい
w_k31

2019/07/07 07:32

function myFunction() { var URLS = [ "https://ads.indd6b819f97bb4d9d0257", "https://ads.ind5388e55fd34d4efade81" ]; var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); var sheet = spreadsheet.getSheetByName("csv"); var lastrow = sheet.getLastRow(); for (var i = 0; i < 2; i++){ var responses = UrlFetchApp.fetch(URLS[i]); var data = responses.getContentText(); var csv = Utilities.parseCsv(data); sheet.getRange(lastrow+1, 1, csv.length, csv[0].length).setValues(csv); } } --------------- 上記でも、1つのデータのみでした。デバッグで確認すると、変数csvには0と1がありましたが、0にはデータの項目(表示回数やクリック数など)1には企業名と該当する数値が入ってました。この状況を上手く伝えることが出来ていないかもしれないですが、改善点を教えて下さい。
hiroshi0240

2019/07/07 09:04

var lastrow = sheet.getLastRow();は毎回取り直さ無いと意味がないので、for文の中に入れて下さい。
w_k31

2019/07/07 11:53

出来ました! 2次元配列も試しに40個ほどのデータでやってみたのですが、上手く処理されました! 本当にありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問