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

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

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

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

Q&A

2回答

2774閲覧

ファイル重複の条件処理について

uyig

総合スコア6

Google Apps Script

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

0グッド

1クリップ

投稿2020/05/06 12:28

複数のGoogleドキュメントの文章を取得してtxtファイルに変換し、指定フォルダ内に保存する処理を行っています。
その流れの中でフォルダ内にある同じ名前のファイルについて重複しているのであればalertのYES_NOで条件処理を行おうと思っていますが、手詰まってしまいました。
色々な方法を探すために検索しましたが、ヒントを得ることができず皆様の知識をお借りしたくご教授いただけないでしょうか。
前置きが長くなり申し訳ございませんが、ここから本題です。

新規txtファイルを作成しつつ、重複ファイルがあれば上書きまたは別名で保存したいのですが、条件処理を行うことで新規txtファイルも作成されてしまいます。(この処理は当たり前だとわかっています。)
重複ファイルがなければ、新規作成。
重複ファイルがあれば分岐処理する方法を教えていただけないでしょうか。

//グーグルドキュメントの中身が空でなければ処理を開始 if(!document_data == ''){ //保存先フォルダ内のファイルを一括取得 var files = folder_id.getFiles(); //配列の準備 var arr_name = []; var arr_id = [];  //保存対象のグーグルドキュメントのファイル名を変数へ  var searchTittle = taisho_file_name; //フォルダ内のファイル名とIDを洗い出し for(var i = 0; files.hasNext(); i++) { //ファイルの取得 var file = files.next(); //ファイル名とファイルIDの取得 arr_name[i] = file.getName(); arr_id[i] = file.getId(); arr_id[i] = DriveApp.getFileById(arr_id[i]); if(searchTittle == arr_name[i]){ //ファイル名と拡張子(.txt)を分離し、ファイル名だけを取得 var TittleLen = searchTittle.length; var Tittle = searchTittle.slice(0,TittleLen -4); //アラート文     var ui = DocumentApp.getUi(); var result = ui.alert( searchTittle + 'と同じ名前のファイルがあります。', '上書き : 「はい」' + "\n" + "別名で保存 : 「いいえ」" + "\n" +, ui.ButtonSet.YES_NO);      //ボタン操作処理 if (result == ui.Button.YES) { // 上書き処理 var txt_taisho = Utilities.newBlob("", MimeType.PLAIN_TEXT, "ファイル名").setDataFromString(doc_taisho, "utf-8"); arr_id[i].setContent(txt_taisho); ui.alert('上書きしました。'); break; }else if(result == ui.Button.NO) { // 別名で保存 Tittle = Tittle + "(1)" + ".txt"; var txt_taisho = Utilities.newBlob("", MimeType.PLAIN_TEXT, Tittle).setDataFromString(doc_taisho, "utf-8"); taisho_id.createFile(txt_taisho); ui.alert(Tittle + 'の名前で保存しました。'); break; } } var txt_taisho = Utilities.newBlob("", MimeType.PLAIN_TEXT, "ファイル名").setDataFromString(doc_taisho, "utf-8");    taisho_id.createFile(txt_taisho); }

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

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

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

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

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

guest

回答2

0

回答がつかないようなので、動作確認までしてませんがコメントしてみます。

まず質問にお答えする前にそれ以前の話として、
このプログラムはカッコの数が合っていません。
質問する時の転記ミスですかね?
{ は5個あるのに } は4個しかありません。
それとプログラム中のインデントに全角スペースを使わない方がいいです。
転記ミスならいいですが、動作不良の元になりますのでご注意下さい。
半角スペース、もしくはTabでインデントして下さい。(Tabがオススメです)

では本題ですが、今のプログラムの状態はこうなっているのではないでしょうか。
(分かりやすさのため、問題箇所以外は日本語を交えて記載します)

javascript

1// ファイル数分ループ 2for(var i = 0; files.hasNext(); i++) { 3 ID取得 4 5 // 同じファイル名があったら 6 if(searchTittle == arr_name[i]){ 7 ファイル名から拡張子除外 8 アラートでYESNOを選ばせる 9 10 // YES選んだら 11 if (result == ui.Button.YES) { 12 上書き保存する 13 14 // NO選んだら 15 } else if(result == ui.Button.NO) { 16 別名でファイルを新規作成 17 18 } 19 } 20 21 ファイルを新規作成 22}

問題なのは、まず一番最後の方の「ファイルを新規作成」の部分です。
添付してもらっているプログラムでいうと一番最後の方にある

javascript

1 2 var txt_taisho = Utilities.newBlob("", MimeType.PLAIN_TEXT, "ファイル名").setDataFromString(doc_taisho, "utf-8"); 3 taisho_id.createFile(txt_taisho);

これって本当は、総当たりチェックして全然ヒットしなかったら新規作成したいですよね?
これでは毎ループ新規作成しているのでは・・・と思います。

改善案
フラグ用の変数をforの前で宣言しておき、0を入れておきます。
ループでチェックしていき、同じファイル名があったらその変数に1を入れます。
同じファイル名があったとしても、for文の中ではアラートでYESNOを選ばせません。
同じファイル名があったらフラグの中身を変えて、breakでforを抜けます。

for文を抜けた後で改めて

javascript

1if(フラグが1だったら){ 2 アラートでYESNOを選ばせる 3 YESだったら上書き、NOなら別名保存 4} 5else{ 6 ファイルを新規作成 7}

のようにすれば、毎ループファイルが作られることもありません。

あと、念のための確認ですが・・・

javascript

1var txt_taisho = Utilities.newBlob("", MimeType.PLAIN_TEXT, "ファイル名").setDataFromString(doc_taisho, "utf-8");

実際のプログラムに "ファイル名" って書いてませんよね?
実際のプログラムはきっと、ここが保存したいテキストファイル名になってますよね?
それとも 「ファイル名.txt」 って名前で保存したいのなら別ですが・・・
それと細かいですが、ところどころにある「Tittle」も、「Title」の間違いかな?

投稿2020/05/15 10:35

mkk

総合スコア378

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

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

0

質問から数日経過しましたが、私なりに処理方法を考えてみました。

・処理手順
1)フォルダ内のファイル名を一括取得
2)新規作成ファイル名とフォルダ内ファイル名を比較してカウント
3)カウント数が0であれば新規作成、1以上であれば上書きか別名保存でのalertでの条件処理

処理手順を説明することは簡単ですが、経験が浅いためどうしたらいいのかわかりません。
戻り値など勉強していますが、例えばwhileとfor違いなど、どのように処理を行っているのか全く理解できず苦しんでいます。

投稿2020/05/09 13:13

uyig

総合スコア6

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問