🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google ドライブ

Google ドライブは、Google社が提供するオンラインストレージサービス。オンラインストレージ上に、画像や動画、テキスト、Word/PDFのファイルなどさまざまなファイル保存することができます。また、他のユーザーと共有することも可能です。

Google Apps Script

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

Q&A

解決済

2回答

2678閲覧

GoogleAppScriptでの固定長CSVデータの取り出し

takaD

総合スコア315

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google ドライブ

Google ドライブは、Google社が提供するオンラインストレージサービス。オンラインストレージ上に、画像や動画、テキスト、Word/PDFのファイルなどさまざまなファイル保存することができます。また、他のユーザーと共有することも可能です。

Google Apps Script

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

0グッド

0クリップ

投稿2019/10/28 01:10

前提・実現したいこと

GoogleドライブにあるCSVデータをスプレットシート内に取り込むプログラムを作成しています。
GoogleドライブにあるCSVデータをarray化はできたのですが、そのデータが固定長で、delimiter設定がうまくできません。
また、そのデータ内には「¥」やら「,」が存在し、文字列として差別化しなければならない状態です。

上記の状態の固定長データを取り出すことは実現できたのですが、
私自身がプログラム経験なしの独学のため、賢い書き方がわかりません。

下記コードを、プログラマの視点から見て自分ならこうするなどのご意見を頂けると幸いです。

該当のソースコード

GoogleAppsScript

1function test(){ 2 var arr,arr2,rec,num,ssOut 3 4 arr = MyLibrary.importCSVData(folderID,fileName) 5 //Googleドライブ内のフォルダIDとファイルNameからarray化しています。 6 rec = []; 7 arr2 = []; 8 9for (var a = 0; a < arr.length-1; a++){ 10 num = arr[a].toString()//「,」が含まれたデータのため、差別化してます。 11 rec.push(num.slice(0,6))//ここから固定長データをゴリ押しで分離します。 12 rec.push(num.slice(6,16)) 13 rec.push(num.slice(16,24)) 14 rec.push(num.slice(24,27)) 15 rec.push(num.slice(27,39)) 16 rec.push(num.slice(39,60)) 17 rec.push(num.slice(60,70)) 18 rec.push(num.slice(70,81)) 19 rec.push(num.slice(81,90)) 20 rec.push(num.slice(90,91)) 21 rec.push(num.slice(91,92)) 22 rec.push(num.slice(92,99)) 23 rec.push(num.slice(99,105))//ここまで固定長データを分離してます。 24 arr2.push(rec)//分離した「,」区切りのarr[a]を格納していきます。 25 rec = [] 26 } 27 28 arr2 = MyLibrary.replaceFt(arr2,"\","¥") 29 //array内の「¥」文字を張り付けたときに[]にならない様に置換しています。 30 //以降arrayの貼り付けプログラム 31 32}

試したこと

私個人としては
rec.push(num.slice(6,16))
rec.push(num.slice(16,24))
rec.push(num.slice(24,27))
rec.push(num.slice(27,39))
の書き方が改善の余地がありそうな気がしてはいても、その方法が解らない状態になります。

固定長データを取り扱うメソッドを検索してもGoogleAppScriptでは
情報がみつかりませんでした。

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

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

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

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

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

guest

回答2

0

dodox86様のアイディアを参考に下記コードになりましたので一応張っておきます。
最終的にスプレットシートに貼り付けを行いたいため、二次配列化させるように、
.join(",")は省略しました。

汎用性とメンテナンス性にすぐれたLibrary化ができました。
改めてありがとうございました。

GAS

1function test3() { 2 3 var arr,arr2,rec,num,ssOut 4 5 arr = myLibrary.importCSVData(folderID,fileName) 6 const cols = [6,10,8,3,12,21,10,11,9,1,1,7,6]; 7 8 arr2 = fixedLenCSV(arr,cols) 9 arr2 = myLibrary.replaceFt(arr2,"\","¥") 10 11//以降貼り付け用のプログラム 12 13} 14 15 16//固定長arrayListを一次配列文字数で分離する。 17function fixedLenCSV(array,cols) { 18 var a = array; 19 var a2 = []; 20 var rec = []; 21 22for (var i = 0; i < a.length; i++) 23 { 24 var s = a[i].toString() 25 cols.forEach(function(colLen) 26 { 27 var part = s.substring(0, colLen); 28 rec.push(part); 29 s = s.substring(colLen); 30 }); 31 32 a2.push(rec); 33 rec = []; 34 } 35return a2 36} 37

投稿2019/10/28 05:42

編集2019/10/28 07:47
takaD

総合スコア315

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

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

0

ベストアンサー

一例ですが、こんなのはいかがでしょうか。固定の文字列から各項目(カラム)ごとの長さで切り出し、","でarray.joinするサンプルです。
Goole Apps Scriptで動きます。

GAS

1function test2() { 2 // 切り出したい固定長文字列 3 var source = "1223334444555556666667777777"; 4 5 rec = []; 6 7 // 固定長のカラムの長さを配列にする。 8 const cols = [1, 2, 3, 4, 5, 6, 7]; 9 10 // ワーク用としてsへ 11 var s = source; 12 13 // 配列の要素数分を処理 14 for each(colLen in cols) { 15 // 頭からカラムの長さ分取って 16 var part = s.substring(0, colLen); 17 18 // recにpushして格納 19 rec.push(part); 20 21 // 頭からカラムの長さ分を除去して、次の文字列にする。 22 s = s.substring(colLen); 23 } 24 25 // ","でjoin 26 var result = rec.join(","); 27 return result; 28} 29 30// 確認用 31function test23() { 32 33 var result = test2(); 34 35 // "1,22,333,4444,55555,666666,7777777" と表示される。 36 Browser.msgBox(result); 37}

追記しました: 2019-10-28 12:22

Google Apps ScriptでforEachが使えないな?、と思ってfor each文でループを回しましたが、使えました。

GAS

1// 右のコードでは使えない: cols.forEach(colLen => { 2cols.forEach(function(colLen) { 3 var part = s.substring(0, colLen); 4 rec.push(part); 5 s = s.substring(colLen); 6});

投稿2019/10/28 03:06

編集2019/10/28 03:22
dodox86

総合スコア9254

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

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

takaD

2019/10/28 05:34

早速の回答ありがとうございます。 このコードを参考に手を加えましたらとても汎用性があり、スマートに仕上がりました。 ありがとうございました。
dodox86

2019/10/28 05:36

未経験の初心者さん、とのことでしたが、当初のコードが力技だとしても、要望のものを一人で作り上げられているのは素晴らしいと思います。がんばってください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問