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

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

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

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

2198閲覧

【Gas】添付ファイル自動抽出&バックアップ時、同名ファイルが重複で保存されてしまいます

Pandam_Papa

総合スコア1

Google Apps Script

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2020/08/26 09:52

前提・実現したいこと

Gasを使って
「条件に一致した添付ファイルを、
自動抽出&自動で指定のフォルダにバックアップ」
という機能を実現したいと思います。

その場合、
「すでにフォルダ内に存在しているファイルを、
重複でバックアップとらないようにする」という風にしておきたいです。

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

【◯】エラーメッセージ自体は特に発生していません。

【◯】条件抽出、自動バックアップといった、
基本的な機能も一応動作できています。

【☓】しかしながら、
「重複バックアップしない」という機能は上手く動作しません。
(同名ファイル存在しているにも関わらず、
バックアップされてどんどん保存されていきます。)

該当のソースコード

Google

1function fetchFile(){ 2 const FOLDER_ID = 'ドライブID'; 3 const SEARCH_TERM = '検索条件'; 4 const folder = DriveApp.getFolderById(FOLDER_ID); 5 const files = folder.getFiles(); 6 const threads = GmailApp.search(SEARCH_TERM, 0, 500); 7 const messages = GmailApp.getMessagesForThreads(threads); 8 for(const thread of messages){ 9 for(const message of thread){ 10 const attachments = message.getAttachments(); 11 for(const attachment of attachments){ 12 let flag = true; 13 14 while (files.hasNext()) { 15  let fileName = files.next().getName(); 16  if ( fileName === attachment.getName() ) { flag = false } 17 } 18 if( flag ) { folder.createFile (attachment) } 19 } 20 } 21 } 22}

試したこと

既存ファイル.getFilesName()!== 新たに取得したいファイル.getName()
など、数パターンほど異なる条件判定方法を試しましたが、
いずれも上手く動作しませんでした。

補足情報(FW/ツールのバージョンなど)

最新のGoogleAppsScriptV8記述によって作成しています。

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

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

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

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

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

guest

回答2

0

ベストアンサー

ループの外側で、const files = folder.getFiles();としてますが、この files は FileIterator のため、全て列挙し終わったあとはずっとfiles.hasNext()は false を返し続けるため、while (files.hasNext()) {の直前にconst files = folder.getFiles();を呼ぶ必要があります。実際は名前を指定して取得(folder.getFilesByName())した方がいいですが。

JavaScript

1function fetchFile() { 2 const FOLDER_ID = "ドライブID"; 3 const SEARCH_TERM = "検索条件"; 4 const folder = DriveApp.getFolderById(FOLDER_ID); 5 // const files = folder.getFiles(); 6 const threads = GmailApp.search(SEARCH_TERM, 0, 500); 7 const messages = GmailApp.getMessagesForThreads(threads); 8 for (const thread of messages) { 9 for (const message of thread) { 10 const attachments = message.getAttachments(); 11 for (const attachment of attachments) { 12 // let flag = true; 13 // while (files.hasNext()) { 14 // let fileName = files.next().getName(); 15 // if (fileName === attachment.getName()) { 16 // flag = false; 17 // } 18 // } 19 const flag = !folder.getFilesByName(attachment.getName()).hasNext(); 20 if (flag) { 21 folder.createFile(attachment); 22 } 23 } 24 } 25 } 26}

投稿2020/08/26 10:58

draq

総合スコア2573

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

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

Pandam_Papa

2020/08/26 13:00

draqさん 大変詳細かつ分かりやすいご回答、 誠ににありがとうございます! なるほどgetFiles()はイテレータが返ってくるのですねえ... 概念自体は少しかじったことありますが、 いざ応用となるとぜんぜん使いこなせてません(^_^;) ご教示くださったコードで修正してみて、 きちんと動作できるようになりました。 改めまして、心より感謝を申し上げます。
guest

0

その名前のファイルがそこに存在するかどうかをチェックすればどうなんでしょうか

投稿2020/08/26 09:55

y_waiwai

総合スコア87800

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

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

Pandam_Papa

2020/08/26 13:01

y_waiwaiさん ご回答ありがとうございます。 参考とさせていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問