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

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

ただいまの
回答率

88.59%

GASで複製したファイルを操作することについて

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 282

takamon

score 6

前提・実現したいこと

GASでコピーした新しいスプレッドシートの中で、新シートを作成したい。

たとえば、「templete」というスプレッドシートを複製して、「202008」というスプレッドシートを作成しようとしてます。
その「202008」というスプレッドシートの中にある、各曜日用のテンプレートシートを、
曜日に合わせて複製して、「0801」から「0831」まで作成しようとしてます。

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

複製したスプレッドシートを操作できずに困っています。

TypeError: duplicatedSS.getSheetByName is not a function(行 36、ファイル「createSheet」)表示しない

▼ログです
[20-09-02 04:22:52:590 PDT] {}
[20-09-02 04:22:52:685 PDT] 01
[20-09-02 04:22:52:696 PDT] Sat Aug 01 2020 00:00:00 GMT+0900 (日本標準時)
[20-09-02 04:22:52:701 PDT] TypeError: duplicatedSS.getSheetByName is not a function
    at createSheet(createSheet:36:44)
    at myFunction(main:4:5)

該当のソースコード

★★ここで他のスプレッドシートのセルに記載されているデータから作成したい「月」を取得
function getMakingMonth() {
  const ss = SpreadsheetApp.openById(スプレッドシートID);
  const sheet = ss.getSheetByName(シート名);
  const range = sheet.getRange(セル名).getValue();
  var shiftDate = new Date(range);  
  var month = ("0" + (shiftDate.getMonth() + 1)).slice(-2);
  return month;
}

★★ここで他のスプレッドシートのセルに記載されているデータから作成したい「年」を取得
function getMakingYear() {
  const ss = SpreadsheetApp.openById(スプレッドシートID);
  const sheet = ss.getSheetByName(シート名);
  const range = sheet.getRange(セル名).getValue();
  var shiftDate = new Date(range);
  var year = shiftDate.getFullYear();
  return year;
}

★★ここでテンプレートをコピー
function copyTemplete(){  
  var makingMonth = getMakingMonth();
  var makingYear = getMakingYear();
  var templeteFile = DriveApp.getFileById(ファイルID);
  var OutputFolder = DriveApp.getFolderById(ディレクトリID);
  +Utilities.formatDate(new Date(), 'JST', 'yyyyMM');
  var OutputFileName = templeteFile.getName().replace(元スプレッドシート名, 新スプレッドシート名 + makingYear + makingMonth);
  templeteFile.makeCopy(OutputFileName, OutputFolder);
}

ーーーーー▼別ファイル▼ーーーーー

★★ここで他のスプレッドシートのセルに記載されているデータから作成したい「年月」を取得し、Dateオブジェクトからその月の最終日を取得(作成するシートの枚数を決めるため)
function findLastDays() {
    var year = getMakingYear();
    var month = getMakingMonth();
    var lastDay = new Date(parseInt(year, 10), parseInt(month, 10), 0).getDate();
    return lastDay;
}

★★ここで複製したスプレッドシートを操作して、シートを複製しようとしてます。
function createSheet() {
    var year = getMakingYear();
    var month = getMakingMonth();

<▼▼問題とおもっている箇所>
    var duplicatedSS = DriveApp.getFolderById(フォルダID);
    var file = duplicatedSS.getFilesByName('業務管理シート_' + year + month);
    console.log(file);
<▲▲問題とおもっている箇所>

    var lastDay = findLastDays();

    for (var i = 1; i <= lastDay; i++) {
        var day = ("00" + i).slice(-2);
        var date = new Date(`${year}\/${month}\/${day}`);
        console.log(day);
        console.log(date);
        if (date.getDay() == 0 || date.getDay() == 6) {
            var tempWESheet = duplicatedSS.getSheetByName(コピーしたファイルの中のシート名);
            var copiedSheet = tempWESheet.copyTo(duplicatedSS);
            copiedSheet.setName(year + month + i);
        } else if (calJa.getEventsForDay(date).length > 0) {
            return;
        } else {
            return;   
        }
    }
}


スタンドアロン型です。
main.gsで
copyTempleteメソッドを実行してテンプレートは作成されたあと、
createSheetメソッドを実行して複製したテンプレートの中から該当するシートを複製しようとしてます。

繰り返しで恐縮ですが、やりたいことは、
たとえば、「templete」というスプレッドシートを複製して、「202008」というスプレッドシートを作成しようとしてます。
その「202008」というスプレッドシートの中にある、各曜日用のテンプレートのシートを、
曜日に合わせて複製して、「0801」から「0831」まで作成しようとしてます。

問題点と思っている箇所なのですが、
1行目のログがconsole.log(file)の箇所なのですが、
こちらが空のため取得出来ていないのだと思いました。

いろいろと調べてみたのですが、解決策が見つかりませんでした。

申し訳ございませんが、アドバイスなどいただけましたら幸いです。
よろしくお願いいたします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

問題点と思っている箇所なのですが、
1行目のログがconsole.log(file)の箇所なのですが、
こちらが空のため取得出来ていないのだと思いました。

ご推察の通り、ファイルが取得できていないです。

原因として考えられるのは、コードを信じるのなら
var duplicatedSS = DriveApp.getFolderById(フォルダ名);
ここはフォルダIDですね。アウトプット先のフォルダIDを指定しないといけません。

もうひとつは
var file = duplicatedSS.getFilesByName(ファイル名);
ここのファイル名、間違っていませんか。

copyTemplete()を実行して、スプレッドシートが作成されているのが確認できてから、createSheet()を実行して同じエラーがでるのなら、原因は上記ぐらいしかないのかな、と思います。

追記1

function createSheet() {
    var year = getMakingYear();
    var month = getMakingMonth();

    var duplicatedSS = DriveApp.getFolderById(フォルダID);
    const files = duplicatedSS.getFiles();
    while(files.hasNext()) {
      const file = files.next();
      console.log(file.getName());
    }
    var file = duplicatedSS.getFilesByName('業務管理シート_' + year + month);
    console.log(file);

    // 以下略
}

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/09/03 20:13 編集

    コメントありがとうございます。

    フォルダIDの件失礼しました。
    var duplicatedSS = DriveApp.getFolderById(フォルダID);
    こちらIDで実施してます。

    もう一つのファイル名が間違っているというのはどういう内容なのでしょうか。
    お手数ですがご教授いただければ幸いです。

    現状以下のようにしてます。
    ▼現状
    var duplicatedSS = duplicatedSS.getFilesByName('業務管理シート' + year + month);

    質問文の中のコードもIDであることと、このファイル名の部分は直しておきます。
    失礼しました。

    キャンセル

  • 2020/09/04 08:05

    >もう一つのファイル名が間違っているというのはどういう内容なのでしょうか。
    単純に指定しているファイル名のファイルがないのでは?ということです。

    例えば
    duplicatedSS.getFiles()で取得できるファイル群に指定したファイルは存在しているのか?
    追記1にてサンプルを記載しますので、確認してみてください。

    キャンセル

  • 2020/09/04 18:30 編集

    追記ありがとうございました。
    こちら取得できました。

    追記で記載いただいていたメソッドやオブジェクトを検索してなんとかたどり着きました。

    イテレーターオブジェクトというものになるのですね。
    hasNextメソッドでファイルが存在していたらtrueを返す。
    nextメソッドで、ファイルを一つずつ取得するという過程で、file.getIdメソッドでIDを取得てみました。
    さらに、SpreadSheetAppオブジェクトのopenByIdメソッドで取得できました。

    IDを取得して格納した変数にgetSheetByNameメソッドで複製したいシートを指定して、copyToメソッドでスプレッドシートを指定してシートのコピーもできました。

    ありがとうございました。


    ▼このようになりました。ありがとうございます。

    function getDuplicatedFile(){
    //シフト表の年を取得
    var year = getMakingYear();

    //シフト表の月を取得
    var month = getMakingMonth();

    //ドライブの中の複製先のフォルダを指定し、その中のファイルを取得
    var files = DriveApp.getFolderById('ID').getFiles();
    var fileName = '業務管理シート_' + year + month;

    while(files.hasNext()){
    var file = files.next();//戻り値はFile型
    var duplicatedFileName = file.getName();
    var fileId = file.getId();
    Logger.log(fileId);

    if(duplicatedFileName === fileName){
    createSheet(fileId, year, month);
    break;
    }
    }
    }


    function createSheet(fileId, year, month) {
    var lastDay = findLastDays();
    var calJa = CalendarApp.getCalendarById('ja.japanese#holiday@group.v.calendar.google.com');
    var ss = SpreadsheetApp.openById(fileId);

    for (var i = 1; i <= lastDay; i++) {
    var day = ("00" + i).slice(-2);
    Logger.log(day);
    var date = new Date(`${year}\/${month}\/${day}`);

    if (date.getDay() == 0 || date.getDay() == 6) {
    Logger.log(date.getDay());
    //スプレッドシートをアクティブにする
    var tempWESheet = ss.getSheetByName('土日テンプ');
    //土日のシートを取得して複製する
    var copiedSheet = tempWESheet.copyTo(ss);
    copiedSheet.setName(year + month + day);
    }
    // if (calJa.getEventsForDay(date).length > 0) {
    // var tempHDSheet = ss.getSheetByName('祝日テンプ');
    // var copiedSheet = tempHDSheet.copyTo(ss);
    // copiedSheet.setName(year + month + day);
    // }
    else{
    var tempWDSheet = ss.getSheetByName('平日テンプ');
    var copiedSheet = tempWDSheet.copyTo(ss);
    copiedSheet.setName(year + month + day);
    }
    }
    }

    ```

    キャンセル

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

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

関連した質問

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