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

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

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

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

Q&A

解決済

1回答

3508閲覧

GAS Document/Folder の新規作成、既存ファイルがひらけない

TD0

総合スコア22

Google Apps Script

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

0グッド

0クリップ

投稿2018/11/08 03:07

お世話になっております。IDベースのopenと名前ベースのopenを練習したく、Google Documentを新規作成/または開くgasを組みたいと考えています。

FolderAというフォルダが存在しない場合は新規作成し、その中にDocA、DocBの二つのドキュメントを作成し開きます。すでにFolderAが存在している場合は、その中にすでに格納されているDocA、DocBを開きたいと考えています。

問題1
下のようなgasで実行しても、フォルダの新規作成ができません。原因は変数"folder"にFileIteratorが戻されているからなのですが、fileが存在していないのに戻り値があるのはなぜですか?

問題2
ファイルが作成された状態で実行しても、documentが開かれることなくプログラミングが終了します。名前で検索してゲットしたIDがnext構文内で5つ取得されており、実効トランスクリプト上ではこれら5つをopenしています。(実際にはウィンドウは開かれません。)どこが間違っていますでしょうか…?

どうぞよろしくお願いいたします。

gas

1function CreateDoc() { 2 3 var search = DriveApp.getFoldersByName("FolderA") 4 Logger.log(search) 5 while (search.hasNext() ){ 6 var folder = search.next(); 7 Logger.log(folder) 8 } 9 10 if(folder == ""){ 11 var Fol = DriveApp.createFolder("FolderA"); 12 var FolderID = Fol.getId(); 13 14 var docNameA = "DocA"; 15 var contentsA = "DocA\n\n" 16 17 var docNameB = "DocB"; 18 var contentsB = "DocB\n\n" 19 20 21 var documentA = DocumentApp.create(docNameA); 22 documentA.getBody().setText(contentsA); 23 var documentB = DocumentApp.create(docNameB); 24 documentB.getBody().setText(contentsB); 25 26 // 移動 27 var targetFolder = DriveApp.getFolderById(FolderID); 28 29 var docFileA = DriveApp.getFileById(documentA.getId()); 30 targetFolder.addFile(docFileA); 31 32 var docFileB = DriveApp.getFileById(documentB.getId()); 33 targetFolder.addFile(docFileB); 34 35 DocumentApp.openById(docFileA); 36 DocumentApp.openById(docFileB); 37 38 }else{ 39 var searchA = DriveApp.getFilesByName("DocA") 40 Logger.log(searchA) 41 while (searchA.hasNext() ){ 42 var fileA = searchA.next(); 43 Logger.log(fileA.getId()) 44 DocumentApp.openById(fileA.getId()); 45 } 46 var searchB = DriveApp.getFilesByName("DocB") 47 Logger.log(searchB) 48 while (searchB.hasNext() ){ 49 var fileB = searchB.next(); 50 Logger.log(fileB.getId()) 51 DocumentApp.openById(fileB.getId()); 52 } 53 } 54}

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

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

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

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

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

guest

回答1

0

ベストアンサー

  • 問題1

拝見する現時点のコードでfolderにfolderiteratorは入らないと思います。searchは確かにFolderAがなくてもイテレータを受け取りますが。
folderはFileオブジェクトまたはundefinedなのでfolder==""は常にfalseです。

あと、イテレータはそういうものです。イテレータを返すという仕様で何も返されないとしたらプログラマはコードが書けません。
何もないというのをどう表現するかは状況依存で、簡単な例で"test".indexOf("z")は-1によってzが文字列にないことを表現します。
不正確ですが、あえて例えればFolderAがないときに取得できるのは長さがゼロの配列です。長さがゼロの配列は、何もないですが、undefinedでもnullでもfalseでも""でもなくArrayです。そのlengthがゼロであることをもって何もないと判断します。同じくhasNext()がfalseであることで何もないとわかるのです。

  • 問題2

openByIdは新しくタブを開いてドキュメントを表示する機能ではありません。プログラム上で開いて内容にアクセスできるようにする機能です。

想像してください。仮にそういう機能だとしたら、開いたあとスクリプトは文章をどう取得しますか?マウスを動かしてコピペを始めますか?ユーザがトリガーを設定してパソコンの電源を落としていたらどうしますか?もし、パソコンが動いてなくてスクリプトが内容をコピーできると思うなら、なぜ新しいタブを開かないといけないのでしょうか。またグーグルドライブを開いているかで動作が変わるとしたらグーグルはみんなのパソコンの動作状態を知っているのですか?

投稿2018/11/08 05:34

papinianus

総合スコア12705

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

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

TD0

2018/11/09 01:42

問題1 folder == "" の式の戻り値の解釈に誤りがあったこと、理解しました。 問題2 openByIdについても完全に勘違いをしていました。 if構文でhasNext時に重複がある旨msgBoxを出すにとどめることにします、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問