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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

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

Q&A

解決済

1回答

4432閲覧

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

takamon

総合スコア7

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

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

0グッド

0クリップ

投稿2020/09/02 11:34

編集2020/09/03 11:16

前提・実現したいこと

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)の箇所なのですが、
こちらが空のため取得出来ていないのだと思いました。

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

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

問題点と思っている箇所なのですが、
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/02 23:26

編集2020/09/03 23:09
macaron_xxx

総合スコア3191

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

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

takamon

2020/09/03 11:17 編集

コメントありがとうございます。 フォルダIDの件失礼しました。 var duplicatedSS = DriveApp.getFolderById(フォルダID); こちらIDで実施してます。 もう一つのファイル名が間違っているというのはどういう内容なのでしょうか。 お手数ですがご教授いただければ幸いです。 現状以下のようにしてます。 ▼現状 var duplicatedSS = duplicatedSS.getFilesByName('業務管理シート' + year + month); 質問文の中のコードもIDであることと、このファイル名の部分は直しておきます。 失礼しました。
macaron_xxx

2020/09/03 23:05

>もう一つのファイル名が間違っているというのはどういう内容なのでしょうか。 単純に指定しているファイル名のファイルがないのでは?ということです。 例えば duplicatedSS.getFiles()で取得できるファイル群に指定したファイルは存在しているのか? 追記1にてサンプルを記載しますので、確認してみてください。
takamon

2020/09/04 09:31 編集

追記ありがとうございました。 こちら取得できました。 追記で記載いただいていたメソッドやオブジェクトを検索してなんとかたどり着きました。 イテレーターオブジェクトというものになるのですね。 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); } } } ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問