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

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

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

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

Q&A

解決済

2回答

8711閲覧

【Google apps script】CSVから特定のデータを抽出し、書き込みたい

yskt

総合スコア16

Google Apps Script

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

0グッド

0クリップ

投稿2018/10/16 02:57

編集2018/10/17 03:57

前提・実現したいこと

ドライブ上にあるCSVファイルを特定のスプレッドシートの特定のシートに書き込みしたいです。
かつ、CSVデータも特定の条件で抽出して書き込みたいです。

列A列B列C
くだものりんご100円
やさいにんじん100円
くだものぶどう200円
くだものいちご300円
やさいキャベツ200円
やさいなすび150円
さかなさんま200円

こんな感じの「たべもの.csv」というファイルがドライブ上にあったとした場合、
列Aが「くだもの」のデータだけを特定のスプレッドシートに書き込みたいです。

該当のソースコード

//書き込む対象のSpread Sheetを定義 var ss = SpreadsheetApp.getActiveSpreadsheet(); var sh = ss.getSheetByName("シート名"); function importData() { var folderId = "フォルダID"; var fileName = "たべもの.csv"; var files = DriveApp.getFolderById(folderId).getFiles(); while (files.hasNext()) { var file = files.next(); if (file.getName() == fileName) { var data = file.getBlob().getDataAsString("Shift_JIS"); var csv = Utilities.parseCsv(data); sh.getRange(1,1,csv.length,csv[0].length).setValues(csv); } } }

わからないこと

上記コードだと全件が抽出、書き込みされます。
どこで指定してあげるべきか、書き方などがわかりません・・・
クエリなどを使用するのでしょうか?
できれば1件ずつループしてif分で判断するよりかは
クエリなどで抽出できるならばそちらがありがたいです(件数が多いため)
実現可or不可もわからないため教えていただきたいです。

追加質問

列A列B列C列D列E
2018/09/02101くだものりんご100円
2018/09/12102やさいにんじん100円
2018/10/31101くだものぶどう200円
2018/11/13101くだものいちご300円
2018/11/30102やさいキャベツ200円
2018/12/02102やさいなすび150円
2018/12/24103さかなさんま200円

条件指定の際に、他のシートのセルから取得した日付、数値をキーに検索したいです。
他のシートのセルA1には2018年9月30日 セルA2には数値:101の情報が記載されています。
日付は月末日になっているのですが列Aが2018年9月分かつ列Bが101のデータを取得したいです。

下記のように101をセルから取得し、変数valueに格納、 変数valueを条件に指定してみましたがうまくいきませんでした。 ```ここに言語名を入力 //値セル var range = sh2.getRange("A2"); //値格納 var value = range.getValue();

また、日付の場合はセルから取得した年月のみで判定したいのですが
こちらの方法もわからない状況です。

よろしくお願いいたします。

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

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

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

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

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

papinianus

2018/10/17 02:42 編集

要件は可能な限り明確化してください。また検索するものが文字なのか数値なのか **日付** なのかは非常に重要になり得ますので、雰囲気の例ではなく、可能な限りやりたことに添った仕様を書いたほうが有益な回答が得られます。
yskt

2018/10/17 03:58

追加で記載させていただきました。もしご存知でしたらご教授願います。
guest

回答2

0

ベストアンサー

forと比べて速度は変わらないかもしれないですが

js

1if (file.getName() == fileName) { 2 var data = file.getBlob().getDataAsString("Shift_JIS"); 3 var csv = Utilities.parseCsv(data); 4 var val = sh.getRange(1,1).getValue(); 5 var setData = csv.filter(function(row) { 6 return row[0] == val; 7 }); 8 // ヘッダ 9 sh.getRange(2,1,1,csv[0].length).setValues([csv[0]]); 10 // ボディ 11 if (setData.length) { 12 sh.getRange(3,1,setData.length, setData[0].length).setValues(setData); 13 } 14}

投稿2018/10/17 00:50

編集2018/10/17 06:39
macaron_xxx

総合スコア3191

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

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

yskt

2018/10/17 03:59 編集

ご回答ありがとうございます! 無事解決できました! 追加で質問があるのですが、上記に記載させていただきました。 もしよろしければこちらもご教授頂きたいです。
macaron_xxx

2018/10/17 06:42

フィルタの結果がない場合にエラーを起こしていたので修正しました。 変数にした場合、StringとNumberを比較できるように`==`に変更しました。 日付の比較は(CSV側はnew Dateしてから)、それぞれgetFullYear()とgetMonth()の両方が一致する条件でいけると思いますよ。
yskt

2018/10/19 02:27

やりたいことがすべて実現できました。 ありがとうございます。
guest

0

  • 実現可
  • 1件ずつループしてifで判断する

→ifを使うかは実装依存ですが、csvである以上、queryのようなシート関数は使えない(はず)なので、全件チェックするしかないです。
var csv = Utilities.parseCsv(data);のあとでcsvをフィルタする処理を書けばいいと思います。下記参考に

  • 一旦全てスプレッドシートに起こして、シート関数を使うという方法も可能なのではないかと思います

forは苦手なのであくまで参考として

javascript

1const key = SpreadsheetApp.getActiveSheet().getRange("A1").getValue(); 2var ret = []; 3for(var i = 0; i< csv.length;i++){ 4 if(csv[i][0] == key) {ret.push(csv[i]);} //===だと型比較になるからとりあえず==にしとく。 5} 6sh.getRange(1,1,ret.length,ret[0].length).setValues(ret);

動作確認はしていません。

投稿2018/10/17 00:34

編集2018/10/17 02:52
papinianus

総合スコア12705

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

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

yskt

2018/10/17 02:07

ご回答ありがとうございます! 他の方法のご提案も感謝いたします! フィルタを使用してできました^^
papinianus

2018/10/17 02:38

今の時点では本来やりたいことはできてないように拝見するのは気のせいでしょうか? というか、変数でやりたいなら、最初から質問にその旨書いたほうがいいです。
yskt

2018/10/17 02:44

すみません・・ 質問時にはそのことまで考えておらず・・ 質問に追記させていただきます><
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問