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

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

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

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

Q&A

解決済

1回答

2074閲覧

エラーがでます。TypeError: Cannot read properties of undefined (reading 'length')

minako_151

総合スコア1

Google Apps Script

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

0グッド

0クリップ

投稿2023/12/07 04:59

編集2023/12/07 06:11

実現したいこと

GASでGoogleドライブフォルダー直下の全ファイルの共有リンク (共有URL) を一括作成してスプレッドシートにペーストしたい

前提

引用元をコピペ、一部修正して実行したのですが、エラーがでます。
調べても解決方法が分からなかったので何が問題でどう解決したらよいのか教えてください。

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

TypeError: Cannot read properties of undefined (reading 'length') createSharedUrl

該当のソースコード

function createSharedUrl() { //アクティブなシートを取得する var ss = SpreadsheetApp.getActiveSpreadsheet(); var sh = ss.getActiveSheet(); //変数folderに指定したフォルダーを格納する //★★★ フォルダーIDを記入 ★★★ var folder = DriveApp.getFolderById('1_MK3Yoi1lToxydTJf7UBTNPRiALAv2wz'); //フォルダー内の全ファイルを変数folderFilesに格納する //変数folderFiles格納されるデータはイテレーターという形式 //※フォルダー直下のファイルのみ格納する var folderFiles = folder.getFiles(); //ファイル名を格納するための空の配列を宣言する var allFiles = []; //変数folderFilesに格納されている全ファイルのファイル名と //共有リンクを配列allFilesに二次元配列で格納する while(folderFiles.hasNext()) { //配列allFilesに追加する配列(ファイル名と共有リンク)を //ループ中に一時的に格納するための空の配列tempFileを宣言する var tempFile = []; //変数folderFilesからファイルのイテレーターをひとつ取り出し //変数fileIteratorに格納する var fileIterator = folderFiles.next(); //ファイル名を取得する var fileName = fileIterator.getName(); //ファイルIDを取得し、ファイルIDをもとにファイルを //指定し変数fileに格納する var fileId = fileIterator.getId(); var file = DriveApp.getFileById(fileId); //変数fileの共有設定を「リンクを知っている全員が閲覧化」に変更する file.setSharing(DriveApp.Access.DOMAIN_WITH_LINK, DriveApp.Permission.VIEW); //共有リンクを変数shareUrlに格納する var shareUrl = file.getUrl(); //配列tempFileにファイル名と共有リンクを格納する //この時点で配列tempFileは以下のようになっている //tempFile = [ファイル名, 共有リンク] tempFile.push(fileName); tempFile.push(shareUrl); //配列tempFileを配列allFilesに格納する //配列の中に配列を入れるのでallFilesは //以下のような二次元配列になる //allFiles = [[ファイル名1, 共有リンク1],[ファイル名2,共有リンク2],….] allFiles.push(tempFile); } //配列allFiles内の要素数、つまり必要な行数を確認する var numRow = allFiles.length; //配列allFiles内の一つ目レコードの要素数、つまり必要な列数を確認する //今回はレコードの要素は「ファイル名」と「共有リンク」なので2になる var numCol = allFiles[0].length; //アクティブなシートの2行目にペースト sh.getRange(2,1, numRow, numCol).setValues(allFiles); }

調査したこと

エラーについて調べてみましたが、該当するような記事を見つけることができませんでしたので質問させてください。

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

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

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

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

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

int32_t

2023/12/07 05:55

allFiles[0] が undefined ということなのでしょうけども、コード全体やコードの意図の説明がないと対処方法を助言するのは無理です。
minako_151

2023/12/07 06:13

ご指摘ありがとうございます。 コード全体を記載させていただきました。 allFiles[0]がundefinedということは、ファイルの指定などが必要ということでしょうか。
YAmaGNZ

2023/12/07 06:15

提示されたコードだとallFilesは空なのでは? allFilesの中身がどうなっているかの確認くらいしていますよね?
guest

回答1

0

ベストアンサー

js

1//ファイル名を格納するための空の配列を宣言する 2var allFiles = [];

このコードから

js

1var numCol = allFiles[0].length;

このコードまでの間に、allFiles を更新する処理がまったくありません。allFiles が空のままなので allFiles[0]undefined です。

js

1//以下のような二次元配列になる 2//allFiles = [[ファイル名1, 共有リンク1],[ファイル名2,共有リンク2],….] allFiles.push(tempFile);

このコード、以下のようにする意図ではありませんか。

js

1//以下のような二次元配列になる 2//allFiles = [[ファイル名1, 共有リンク1],[ファイル名2,共有リンク2],….] 3allFiles.push(tempFile);

投稿2023/12/07 06:18

int32_t

総合スコア21929

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

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

minako_151

2023/12/07 06:29

ありがとうございます!解決しました! 本当に初心者過ぎて、空のままの対処法が分かりませんでした。 勉強します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問