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

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

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

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

Q&A

解決済

2回答

1121閲覧

Google Apps Scriptを使ってCSVを条件をつけてスプレッドシートに取り込みたい

tom80

総合スコア5

Google Apps Script

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

0グッド

1クリップ

投稿2020/03/04 02:24

編集2020/03/04 06:37

Google Apps Scriptを使ってスプレッドシートにGoogleドライブ内の任意のフォルダ内に存在するCSVファイルを取り込みたいです。
取り込み時にスプレッドシートの特定のセルに記載した文字列(10行程度)を参照して、CSVから該当の文字列のあるレコードのみを記載したいです。

取り込むCSVは以下のようなカタチ

TypeSourceurl
AHREFhttp://www.123.com/http://www.456.com/
AHREFhttp://www.123.com/○○.htmlhttp://www.456.com/○○/
IMGhttp://www.123.com/○○.htmlhttp://www.456.com/○○/○○.html
CSShttp://www.789.com/http://www.1011.com/○○/○○.html
AHREFhttp://www.123.com/http://www.789.com/

上記を『Type』列をAHREFで絞り込み、さらに『url』列をスプレッドシートの『シート1』に
記載したUrlを参照して該当のurlが存在してるレコードのみを『シート2』に取り込みたいです。

シート1に『http://www.456.com/』、『http://www.789.com/』を記載

シート2に書き込まれるのは以下

TypeSourceurl
AHREFhttp://www.123.com/http://www.456.com/
AHREFhttp://www.123.com/http://www.789.com/

上記、以下のスクリプトによってCSVを取り込むことはできているのですが、その後の絞り込みをどう実装すべきなのかわからないためご教示いただきたいです。

function

1 2 var sheet = SpreadsheetApp.getActiveSpreadsheet(); 3 4 var csvFolderkey = sheet.getSheetByName('取り込みフォルダ指定').getRange('B2').getValue(); 5 6 if(csvFolderkey == ""){ 7 Browser.msgBox("CSVファイルの格納フォルダのIDが記入されていません"); 8 return 0; 9 } 10 11 var files = DriveApp.searchFiles("'"+csvFolderkey+"' in parents"); 12 var csvFile = ""; 13 14 while (files.hasNext()) { 15 16 csvFile = csvFile + files.next().getBlob().getDataAsString("UTF-8"); 17 } 18 19 var CSV = {}; 20 CSV.parse2 = function(str) { 21 var i, c, r, q, l, m, v, j, len=str.length, rows = [], row = []; 22 m = (l = str.indexOf('\r\n')<0 ? str.indexOf('\r')<0 ? '\n' : '\r' : '\r\n').length; 23 for(i=0,c=r=-1; i<len; i++) { 24 if (str.charAt(i) === '"') { 25 for(j=0,q=i+1; q<len; j++,q++) { 26 q = (q=str.indexOf('"',q)) < 0 ? len+1 : q; 27 if (str.charAt(++q) !== '"') {break;} 28 } 29 row.push((v=str.substring(i+1,(i=q)-1),j) ? v.replace(/""/g,'"') : v); 30 } else { 31 if (c<i) {c=str.indexOf(',',i);c=c<0?len:c;} 32 if (r<i) {r=str.indexOf(l,i);r=r<0?len:r;} 33 row.push(str.substring(i,(i=c<r?c:r))); 34 } 35 if (i === r || l === (m>1?str.substr(i,m):str.charAt(i))) {rows.push(row);row=[];i+=m-1;} 36 } 37 str.charAt(i-1) === ',' && row.push(''); 38 row.length && rows.push(row); 39 str.substr(i-1,m) === l && rows.push([]); 40 return rows; 41}; 42 43 var csvData = CSV.parse2(csvFile); 44 var sheetman = sheet.getSheetByName('CSV結合'); 45 46 47 for (var i = 0; i < csvData.length; i++) { 48 sheetman.getRange(i+1, 1, 1, csvData[i].length).setValues(new Array(csvData[i])); 49 } 50 51 Browser.msgBox("CSVデータのインポートが完了しました。"); 52}

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

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

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

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

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

macaron_xxx

2020/03/04 04:18

何を「よろしくお願いいたします」かわかりません。
tom80

2020/03/04 06:30

失礼いたしました。 詳細をもう少し加筆します。
guest

回答2

0

ベストアンサー

シート 1 のすがたが分からないので、シート 1 にあるものに絞る方法は書いてません。
答えが欲しかったら出し惜しみをしないでください。
(私はこの問題について訂正をするつもりはありません。シート 1 にあるものを絞りこみたいという新質問を作ってください。新質問なら、気付いて回答がついていなければ回答します)

javascript

1const importFromCSV = () => { 2 const sheetName = '取り込みフォルダ指定'; 3 const cell = "B2"; 4 const targetSheetName = 'CSV結合'; 5 const book = SpreadsheetApp.getActive(); 6 const csvFolderId = book.getSheetByName(sheetName).getRange(cell).getValue(); 7 if(csvFolderId === ""){ 8 Browser.msgBox("CSVファイルの格納フォルダのIDが記入されていません"); 9 return ; 10 } 11 const target = book.getSheetByName(targetSheetName); 12 [...getCSV(csvFolderId)].forEach(e => { 13 const filtered = e.filter(f=>f[0] === "AHREF"); 14 if(filtered.length === 0) return; 15 const r = target.getRow(); 16 target.getRange(r,1,filtered.length,3).setValues(filtered); 17 }); 18} 19function* getCSV(id) { 20 const files = DriveApp.searchFiles(`${id} in parents`); 21 while (files.hasNext()) { 22 yield Utilities.parseCsv(files.next().getBlob().getDataAsString("UTF-8")); 23 } 24}

投稿2020/03/04 13:40

papinianus

総合スコア12705

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

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

tom80

2020/03/05 00:19

ご回答いただきありがとうございます。 こちらでの質問方法について理解しないまま投稿してしまいました。 次回以降は注意いたします。
tom80

2020/03/05 00:44 編集

絞り込みについては再考した後に別の質問とし上げさていただきます。
guest

0

まずなのですが

var csvFolderkey この行おかしいと思うのですが・・・・

さて、配列で取得したスプレッドシート、それに対して2つの空の配列を用意しておいて、
forループでType列、url列をそれぞれifで判定して、空の配列にレコード単位でpush

それぞれの配列を最後にそれぞれのスプレッドシートへ一発書き込み。これで良いと思いますが。
なんでこんなに複雑なコードにしてしまってるのかが

投稿2020/03/04 12:58

officeforest

総合スコア412

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

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

tom80

2020/03/05 00:27

ご回答いただきありがとうございます。 ネット上の情報をいろいろ組み合わせて何とか現在のカタチでCSVを取り込めたという状態のため複雑というか雑多になっているのだと思います。 ご回答いただいた内容を参考にして、調べながら改良していきます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問