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

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

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

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

Q&A

解決済

2回答

1312閲覧

GASでGドライブのフォルダに格納されている複数のファイルを、スプレッドシートにあるそれぞれのシートに定期的にインポートしたい

GAKI

総合スコア5

Google Apps Script

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

0グッド

0クリップ

投稿2022/07/23 12:04

編集2022/07/24 02:07

前提

ノンプログラマーのド素人です。
画像の通り、「_」より前の名前別でシートに自動でインポートさせたいです。
色々なサイトをググって、コードを借りて実装してみたのですが、安定して取り込みができません。
(想定外のシートに取り込まれたり、貼り付け先のシートにデータが入っていないと途中でストップしたり・・)

ド素人なため、どのコードがエラーの原因なのかがさっぱりわからないため、、何がいけないかを教えていただけないでしょうか。。

実現したいこと

  • ドライブのフォルダにあるファイルをスプレッドシートに毎日自動でインポートしたい
  • 同じシートの最終行へどんどん追加されていくようにしたい
  • 自動でインポートされたものから、順次、使用済みフォルダへ移動させたい

イメージ説明

発生している問題・エラーメッセージ

コードを修正して、実装してみました。
ファイルの移動はできたのですが、肝心のスプレッドシートへの転記が全く動きません。
データの取得からセットまでのコードの正解がわかりません。。

該当のソースコード

GAS

1function ABCファイル() { 2 3 const AAA = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('AAA'); 4 const BBB = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('BBB'); 5 const CCC = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('CCC'); 6 7 let row = 1; 8 9 //指定フォルダ内のファイルを一括取得(FileIteratorオブジェクト) 10 const files = DriveApp.getFolderById('▲読み込み先フォルダID▲').getFiles(); 11 //使用済みフォルダ(上記フォルダ内) 12 const moveDir = DriveApp.getFolderById('▲移動先フォルダID▲'); 13 14 //正規表現で絞り込む 15 const AAAreg = /^AAA.*?$/; 16 const BBBreg = /^BBB.*?$/; 17 const CCCreg = /^CCC.*?$/; 18 19 while (files.hasNext()) { 20 21 const file = files.next(); 22 const filename = file.getName(); 23 console.log(filename); 24 25 const fileId = file.getId(); 26 const blob = DriveApp.getFileById(fileId).getBlob(); 27 const csv = blob.getDataAsString(); 28 const values = Utilities.parseCsv(csv); 29 values.shift(); 30 31 if (filename.match(AAAreg)) { //条件に合致するファイル名のみ書き込み 32 const lastRow= AAA.getRange(1, 1).getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow(); 33 AAA.getRange(lastRow, 1).setValue(values); 34 row++; 35 } 36 if (filename.match(BBBreg)) { //条件に合致するファイル名のみ書き込み 37 const lastRow= BBB.getRange(1, 1).getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow(); 38 BBB.getRange(lastRow, 1).setValue(values); 39 row++; 40 } 41 if (filename.match(CCCreg)) { //条件に合致するファイル名のみ書き込み 42 const lastRow= CCC.getRange(1, 1).getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow(); 43 CCC.getRange(lastRow, 1).setValue(values); 44 row++; 45 } 46 47 SpreadsheetApp.flush() 48 file.moveTo(moveDir);//使用済みフォルダに移動 49 } 50}

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

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

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

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

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

guest

回答2

0

ベストアンサー

js

1 AAA.getRange(lastRow, 1).setValue(values);

これだと、データのある最下行の A 列に、values の1番目の値を書き込むだけなので、
下記のように getRange 内で書き込み先を範囲指定します。

js

1 AAA.getRange(lastRow + 1, 1, values.length, values[0].length).setValues(values);

BBB, CCC も同じです。

後半を書き直すと下記のようになります。

js

1function ABCファイル() { 2 ..... 3 ... 4 (略) 5 6 while (files.hasNext()) { 7 8 const file = files.next(); 9 const filename = file.getName(); 10 console.log(filename); 11 12 const fileId = file.getId(); 13 const blob = DriveApp.getFileById(fileId).getBlob(); 14 const csv = blob.getDataAsString(); 15 const values = Utilities.parseCsv(csv); 16 console.log(values) 17 values.shift(); 18 19 if (filename.match(AAAreg)) { //条件に合致するファイル名のみ書き込み 20 const lastRow = AAA.getRange(1, 1).getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow(); 21 AAA.getRange(lastRow + 1, 1, values.length, values[0].length).setValues(values); 22 } 23 if (filename.match(BBBreg)) { //条件に合致するファイル名のみ書き込み 24 const lastRow = BBB.getRange(1, 1).getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow(); 25 BBB.getRange(lastRow + 1, 1, values.length, values[0].length).setValues(values); 26 } 27 if (filename.match(CCCreg)) { //条件に合致するファイル名のみ書き込み 28 const lastRow = CCC.getRange(1, 1).getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow(); 29 CCC.getRange(lastRow + 1, 1, values.length, values[0].length).setValues(values); 30 } 31 32 SpreadsheetApp.flush() 33 file.moveTo(moveDir);//使用済みフォルダに移動 34 } 35}

投稿2022/07/24 04:45

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ご丁寧にコードまでご用意いただき、ありがとうございました!!
実装してみたら、想定どおりの動きとなり、大変助かりました!

values.length, values[0].length
こちら、頭の中に叩き込みます!
調べてみたら、「文字列にlengthを使うと全体の文字数を取得できる」とのこと。
勉強になりました。

getRange(lastRow + 1, 1, values.length, values[0].length).setValues(values);
getRange(最終行+1行、1列目、最大の行、最大の列)
という理解をしました!
これで毎日の作業が格段に楽になります。。!ありがとうございました!

投稿2022/07/24 14:25

GAKI

総合スコア5

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問