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

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

ただいまの
回答率

88.59%

(GAS)フォルダ内のファイルの特定シートのセルの値を取得したい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,833

yuiu

score 17

以前に下記URLで質問し、返答頂いたコードに改良したい。
https://teratail.com/questions/148362

現象:
添付画像(画像①.png)のように取得するフォルダのファイル内にて[集計]シート(const sheetName = "集計";)が存在しないファイルが存在する場合、
スクリプトを実行すると下記エラーが出てしまい、フォルダ内のファイルの特定シートのセルの値を取得できません。
・[TypeError: null のメソッド「getRange」を呼び出せません。]

イメージ説明

追加したい内容
①フォルダのファイル内に[集計]シートが存在するファイルの値のみ取得
※[集計]シートが存在しない場合はスキップするような処理を入れたい。

②添付画像(画像②.png)のように指定したフォルダ(const folderId = "1ZjdNiax9PKRegRA8yfmOoTo4MmYMzyoC"; )内の配下に全てのファイルから集計シートのセルの値を取得したい。
イメージ説明

補足:
①はどうにか解決したいです。
②はできたら・・・解決したい内容となります。
とりあえず①は解決したいと思っております。
よろしくお願いいたします。

※※※コメントに記載している内容についての画像③.png※※※
イメージ説明


以前に解決して頂いたコードとなります。(/questions/148362)
function getFiles(folderId) {

var files = DriveApp.getFolderById(folderId).getFilesByType(MimeType.GOOGLE_SHEETS);
var ret = []
while(files.hasNext()) {
ret.push(files.next().getId());
}
return ret;
}

//実作業
function last_retu() {
const folderId = "1ZjdNiax9PKRegRA8yfmOoTo4MmYMzyoC"; // テストフォルダのid
const sheetName = "集計";
const targetRange = "H:H";
var files = getFiles(folderId);
var totals = []; //結果が入るやつ
files.forEach(function(element, index, array) { //シートidを繰り返しで処理
var sh = SpreadsheetApp.openById(element).getSheetByName(sheetName);
//H列の最終行を取得
var lr = sh.getRange(targetRange).getLastRow();
totals.push(sh.getRange(lr, 8).getValue());//取得した最終行の(最終行, 列の番号)
});

//以下、質問のまま
//取得した時間の書き出すシート
var spreadsheet = SpreadsheetApp.openById('1wyhhUB5GhFihJ9GdMpyUKgdiph5CqpzawomT-D4GFU4');
var sheet = spreadsheet.getSheetByName('取得した時間を書き込む');

//配列でtestcodeファイル内の「取得した時間を書き込む」シートに書きこむ
var ary = [[]];
for (var i=0; i<totals.length; i++) {
ary[0].push(totals[i]);
}
sheet.getRange(1,1,1,ary[0].length).setValues(ary);
}

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

  • 2. 

下記を足していただいて

function getSubDirs(folderId) {
  const dirIter = DriveApp.getFolderById(folderId).getFolders();
  var dirIds = [];
  while(dirIter.hasNext()) {
      dirIds.push(dirIter.next().getId());
  }
  dirIds.forEach(function(element, index, aray) {
    dirIds = dirIds.concat(getSubDirs(element));
  });
  return dirIds;
}
function getFilesWithSubDirs(folderId) {
  const dirs = [folderId].concat(getSubDirs(folderId));
  var fileIds = [];
  dirs.forEach(function(element, index, array){
    fileIds = fileIds.concat(getFiles(element));
  });
  return fileIds;
}

function last_retu()の中の

// var files = getFiles(folderId); //<-ここを
var files = getFilesWithSubDirs(folderId); // こうする


でどうでしょう?

ファイルを準備するのがたいへんなので、テストはしてませんが。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/25 15:25

    return fielIds; を  return fileIds; に書き換えたら期待通りの集計ができました!!
    ありがとうございました!!!m(_ _)m

    キャンセル

  • 2018/10/25 15:38

    ご指摘感謝します。回答を修正しました。

    再帰性があり、API呼び出しを多用しているので、あまり複雑なフォルダ構成にすると途中で処理が打ち切られる危険がありますので、ご注意ください。

    キャンセル

+1

  1.  
var sh = SpreadsheetApp.openById(element).getSheetByName(sheetName);
if(sh === null) {return;} //これを追記
//H列の最終行を取得

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/19 10:18 編集

    はええな
     →返答:if(sh === null) {return;} こちらを入れて実行したら集計シートのないファイルはスキップできました!
    papinianus様の返答も早くてビックリしました・・・!

    キャンセル

  • 2018/10/19 10:32

    自分の図が下手だったせいで逆に理解できませんでした。
    ・テストの下にフォルダAがあり、さらにAの中に3フォルダあって、それら3つの中にはフォルダはない、でOK?
    ・テストの下にフォルダBがある?それともテスト→フォルダA→フォルダB?どちらでしょう?

    キャンセル

  • 2018/10/19 10:52

    申し訳ございません。
    テストフォルダの配下にフォルダA, Bがあります。
    フォルダA,Bの配下にはフォルダはないです。
    ※フォルダA,Bは同じ階層です。
     補足にイメージ(画像③.png)を添付しました。
      (この画像にはフォルダBは表記されていませんが、フォルダAと同じ階層となります。)

    キャンセル

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

  • ただいまの回答率 88.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る