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

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

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

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

Q&A

解決済

1回答

13285閲覧

次のオブジェクトを取得できません。イテレータが末尾に到達しました。のエラーが発生しました。

pandapapa

総合スコア1

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

0グッド

1クリップ

投稿2020/09/24 05:50

前提・実現したいこと

記事作成を外注しており、Googleドライブ上のスプレッドシートやドキュメントをライターさんに共有するのコピペ作業を自動化したいと思っています。

・スプレッドシートから記事名を取得する。
・それをファイル名にしたドキュメントを作成・
・そのドキュメントの権限を編集OKで設定しリンクを取得。
・別のドキュメントを作成する。> 引用テキスト
・そこにファイル名とリンクを本文に書き込む、

という処理を実施したいと思っています。

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

Exception: 次のオブジェクトを取得できません。イテレータが末尾に到達しました。(行 46、ファイル「コード」)

該当のソースコード

function createSS() { //GAS実行のスプレッドシート var activeSS = SpreadsheetApp.getActiveSpreadsheet(); //GAS実行のスプレッドシートのシート var activeSheet = activeSS.getActiveSheet(); //シートのセルを指定(ファイル名用) var range = activeSheet.getRange("C2"); //シートのセルの値を取得(ファイル名用) var fileName = range.getValue(); //新規作成のGoogleドキュメントのid var id = DocumentApp.create(fileName).getId(); //新規作成のGoogleドキュメントのファイル var file = DriveApp.getFileById(id); //GAS実行のスプレッドシートのid var activeId = SpreadsheetApp.getActiveSpreadsheet().getId(); //GAS実行のスプレッドシートのフォルダ var activeFolder = DriveApp.getFileById(activeId).getParents(); //GAS実行のフォルダにGoogleドキュメントをコピー activeFolder.next().addFile(file); //ルートフォルダに作成されたGoogleドキュメントの削除 DriveApp.getRootFolder().removeFile(file); //新規作成したGoogleドキュメントの権限設定 var access = DriveApp.Access.ANYONE_WITH_LINK; var permission = DriveApp.Permission.EDIT; file.setSharing(access, permission); //新規作成したGoogleドキュメントの共有リンク取得 var accessUrl = file.getUrl(); var list = DocumentApp.create("writer用List"); var contents = fileName+"\n"+accessUrl; list.getBody().setText(contents); //GAS実行のフォルダにGoogleドキュメントをコピー activeFolder.next().addFile(list); //ルートフォルダに作成されたGoogleドキュメントの削除 DriveApp.getRootFolder().removeFile(list); }

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

行46は「activeFolder.next().addFile(list);」の箇所だと思われます。

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

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

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

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

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

guest

回答1

0

ベストアンサー

質問はGASに関するものなので、Google Apps Script のタグを付けた方がよいです。

エラーの原因はもしかしたら違うかもですが、GoogleDriveは 複数フォルダのパスを持つ仕組みが廃止され、Windowsのフォルダ構成と同じようなショートカット式の仕組みに変わりました。そのタイミングで addFileも廃止されたはずです。

該当箇所を moveToに変えて試してみてください。

参考
https://qiita.com/tanaike/items/1d3b2cac43cf5c34e9f7

https://google-apps-script.net/instructions/?p=1481


09/25 追記

ちゃんとにコード見たら、原因は別のところでした。失礼しました。

addFileも廃止と発表されてるけど、試したらエラーにならずに動きますね。
でも後々を考えると、moveToに変えておいた方が良いです。

Exception: 次のオブジェクトを取得できません。イテレータが末尾に到達しました。(行 46、ファイル「コード」)

行46は「activeFolder.next().addFile(list);」の箇所だと思われます。

これを、すっかり1つ目の箇所と勘違いしてましたが、エラーが出てくるのは2回目のコードの下の方の部分でしたね。

activeFolder.next() で、フォルダイテレータ(起動しているスプレッドシートが保管されているフォルダの集まり)から、1回目で該当のフォルダを抜き出したのに、もう1回記述してることで、さらにnext(次のもう1個別のフォルダ)を探そうとして、存在しないのでエラーになっています。

ここを記述1回にして定数でおいてあげれば、エラーは回避されます。

さらに試したらlistの方は DriveAppで取得しないとエラーになったので、そこの記述も追記しました。
以下の修正箇所って書いたとこを確認、修正して試してみてください。

function createSS() { //GAS実行のスプレッドシート var activeSS = SpreadsheetApp.getActiveSpreadsheet(); //GAS実行のスプレッドシートのシート var activeSheet = activeSS.getActiveSheet(); //シートのセルを指定(ファイル名用) var range = activeSheet.getRange("C2"); //シートのセルの値を取得(ファイル名用) var fileName = range.getValue(); //新規作成のGoogleドキュメントのid var id = DocumentApp.create(fileName).getId(); //新規作成のGoogleドキュメントのファイル var file = DriveApp.getFileById(id); //GAS実行のスプレッドシートのid var activeId = SpreadsheetApp.getActiveSpreadsheet().getId(); //GAS実行のスプレッドシートのフォルダ var activeFolder = DriveApp.getFileById(activeId).getParents(); //変更箇所 ここで保存先のフォルダを定義してあげる var Folder = activeFolder.next(); //変更箇所 Folderを使った記述に file.moveTo(Folder); //新規作成したGoogleドキュメントの権限設定 var access = DriveApp.Access.ANYONE_WITH_LINK; var permission = DriveApp.Permission.EDIT; file.setSharing(access, permission); //新規作成したGoogleドキュメントの共有リンク取得 var accessUrl = file.getUrl(); var list = DocumentApp.create("writer用List"); var contents = fileName+"\n"+accessUrl; list.getBody().setText(contents); //変更箇所 IDから DriveAppで開きなおす var listid = list.getId(); var listfile = DriveApp.getFileById(listid); //変更箇所 Folderを使った記述に list.moveTo(Folder); }

投稿2020/09/24 06:41

編集2020/09/25 00:19
sawa

総合スコア3002

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

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

pandapapa

2020/09/24 07:06

ご回答誠にありがとうございます。 addFileをmoveToに変えてみたのですが、今度は以下のエラーとなりました。 -- Exception: パラメータ(DriveApp.FolderIterator)が DriveApp.File.moveTo のメソッドのシグネチャと一致しません。(行 28、ファイル「コード」) -- 以下変更後のソースです。 function createSS() { //GAS実行のスプレッドシート var activeSS = SpreadsheetApp.getActiveSpreadsheet(); //GAS実行のスプレッドシートのシート var activeSheet = activeSS.getActiveSheet(); //シートのセルを指定(ファイル名用) var range = activeSheet.getRange("C2"); //シートのセルの値を取得(ファイル名用) var fileName = range.getValue(); //新規作成のGoogleドキュメントのid var id = DocumentApp.create(fileName).getId(); //新規作成のGoogleドキュメントのファイル var file = DriveApp.getFileById(id); //GAS実行のスプレッドシートのid var activeId = SpreadsheetApp.getActiveSpreadsheet().getId(); //GAS実行のスプレッドシートのフォルダ var activeFolder = DriveApp.getFileById(activeId).getParents(); //GAS実行のフォルダにGoogleドキュメントをコピー file.moveTo(activeFolder); //ルートフォルダに作成されたGoogleドキュメントの削除 DriveApp.getRootFolder().removeFile(file); //新規作成したGoogleドキュメントの権限設定 var access = DriveApp.Access.ANYONE_WITH_LINK; var permission = DriveApp.Permission.EDIT; file.setSharing(access, permission); //新規作成したGoogleドキュメントの共有リンク取得 var accessUrl = file.getUrl(); var list = DocumentApp.create("writer用List"); var contents = fileName+"\n"+accessUrl; list.getBody().setText(contents); //GAS実行のフォルダにGoogleドキュメントをコピー list.moveTo(activeFolder); //ルートフォルダに作成されたGoogleドキュメントの削除 DriveApp.getRootFolder().removeFile(list); }
sawa

2020/09/24 07:16

フォルダ取得の記述は変えちゃダメです。 activeFolder のままだと フォルダイテレータ なので、そこは activeFolder.next() を使ってください。 あと、move でファイルの場所を移動させてるので、以下の箇所も不要かと思います。 //ルートフォルダに作成されたGoogleドキュメントの削除 DriveApp.getRootFolder().removeFile(file);
pandapapa

2020/09/24 14:43

ありがとうございます。 まだ理解が追い付いておらずすみません。指摘内容を以下だと考え修正しました。 ========================= //GAS実行のフォルダにGoogleドキュメントをコピー file.moveTo(activeFolder); ↓ //GAS実行のフォルダにGoogleドキュメントをコピー file.moveTo(activeFolder.next()); ========================= すると以下エラーとなってしまいました。(当初のエラーですね) Exception: 次のオブジェクトを取得できません。イテレータが末尾に到達しました。(行 43、ファイル「コード」) function createSS() { //GAS実行のスプレッドシート var activeSS = SpreadsheetApp.getActiveSpreadsheet(); //GAS実行のスプレッドシートのシート var activeSheet = activeSS.getActiveSheet(); //シートのセルを指定(ファイル名用) var range = activeSheet.getRange("C2"); //シートのセルの値を取得(ファイル名用) var fileName = range.getValue(); //新規作成のGoogleドキュメントのid var id = DocumentApp.create(fileName).getId(); //新規作成のGoogleドキュメントのファイル var file = DriveApp.getFileById(id); //GAS実行のスプレッドシートのid var activeId = SpreadsheetApp.getActiveSpreadsheet().getId(); //GAS実行のスプレッドシートのフォルダ var activeFolder = DriveApp.getFileById(activeId).getParents(); //GAS実行のフォルダにGoogleドキュメントをコピー file.moveTo(activeFolder.next()); //新規作成したGoogleドキュメントの権限設定 var access = DriveApp.Access.ANYONE_WITH_LINK; var permission = DriveApp.Permission.EDIT; file.setSharing(access, permission); //新規作成したGoogleドキュメントの共有リンク取得 var accessUrl = file.getUrl(); var list = DocumentApp.create("writer用List"); var contents = fileName+"\n"+accessUrl; list.getBody().setText(contents); //GAS実行のフォルダにGoogleドキュメントをコピー list.moveTo(activeFolder.next()); }
sawa

2020/09/25 00:20

試しに自分の環境で動かしてみたら、エラーの原因は別の箇所だったので回答を編集しました。遠回りしちゃいましたね。失礼しました。
pandapapa

2020/09/25 00:56

ありがとうございます。 以下の箇所を修正したら出来ました!!next()は2回使っちゃダメなんですね。なので定義をしてあげる。(継続利用するのは定義の方!) //変更箇所 Folderを使った記述に list.moveTo(Folder); ↓ //変更箇所 Folderを使った記述に listfile.moveTo(Folder); moveToなどファイル移動の場合はDriveAppで開いてから、ですね! ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問