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

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

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

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

Q&A

解決済

3回答

7769閲覧

スプレッドシートのシートを生成したとき、シート名が重複した場合、上書きさせたい。

dell_0

総合スコア25

Google Apps Script

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

0グッド

1クリップ

投稿2020/03/11 03:48

編集2020/03/11 07:49

gasで複数のシートがあるスプレッドシートを、シートごとに別々のスプレッドシートを生成しているのですが、シート名が重複した場合、エラーで停止してしまう為、上書きさせたいです。

function q210165() {
const targetFolder = DriveApp.getFolderById('指定フォルダのID');
const sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
const newSheetName = Utilities.formatDate(new Date(), "GMT+9", "yyyy-MM-dd");

sheets.forEach(function(sheet) {
var name = sheet.getSheetName();
var files = targetFolder.getFilesByName(name);
if(files.hasNext()) {
var ss = SpreadsheetApp.openById(files.next().getId());
} else {
ss = SpreadsheetApp.create(name);
var file = DriveApp.getFileById(ss.getId());
targetFolder.addFile(file);
DriveApp.removeFile(file);
}
sheet.copyTo(ss).setName(newSheetName);

var d = ss.getSheetByName("シート1"); if(d) { ss.deleteSheet(d); }

});
}

宜しくお願い致します。

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

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

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

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

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

guest

回答3

0

javascript

1const q246422 = () => { 2 const folderId = ""; 3 const targetFolder = DriveApp.getFolderById(folderId); 4 const sheets = SpreadsheetApp.getActive().getSheets(); 5 const sheetNameToCopy = Utilities.formatDate(new Date(), "JST", "yyyy-MM-dd"); 6 sheets.forEach(s => { 7 const name = s.getName(); 8 const fileIter = targetFolder.getFileByName(name); 9 const targetBook = fileIter.hasNext() ? SpreadsheetApp.open(fileIter.next()) : SpreadsheetApp.create(name); 10 targetFolder.addFile(targetBook.getId()); 11 const sheetToCopy = targetBook.getSheetByName(sheetNameToCopy) || targetBook.insertSheet().setName(sheetNameToCopy); 12 sheetToCopy.clear(); 13 s.getDataRange().copyTo(sheetToCopy.getRange(1, 1)); 14 }); 15}

Range にも CopyTo があるのでそちらでやってるとこうかなというコード例。

そもそも、シートの名前を日付にするという仕様にしたのなら 1 日に 1 回以上 push するのをやめたほうがいいと思います。1 日に何度も push するのが必要な業務なら、シート名を時分まで入れればよいはず。

例えば名前フォルダのものは共有して公開しているなどの都合で、更新頻度を高くしないといけないのだとしても親シート(全員の名前を含むシート)で編集をしていることから、更新は今日のシートでしか起こらないと想定できます。
このような場合、当日分は "today" などの本日を意味する名前のシートに表示することにし、importrange で編集している親シートから参照させることにしたうえで、日をまたぐ頃合いにスクリプトを実行させることにして、全てのブックを更新し、today シートの表示値を取得して、昨日のシートを新設して、値をコピーする、という処理をするのがよいように思えます。

投稿2020/03/12 14:46

papinianus

総合スコア12705

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

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

dell_0

2020/03/13 05:06

回答、まことにありがとうございます。 今後、運用方法自体をかんがえつつ、コードの改修をしていこうと思います。 大変勉強になりました。ありがとうございます。
guest

0

ベストアンサー

setName()する前に削除すればよいのでは?

gas

1var newSheet = ss.getSheetByName(newSheetName); 2if(newSheet) { 3 ss.deleteSheet(newSheet); 4} 5sheet.copyTo(ss).setName(newSheetName);

投稿2020/03/11 05:09

Y.H.

総合スコア7914

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

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

dell_0

2020/03/11 08:07

ありがとうございます。 頂いたコードを試してみましたが、動作確認出来ました。ありがとございます。 ただ、シートが1つしかない場合は、 「ドキュメント内のシートをすべて削除することはできません。」 とエラーが出てしまいます。こちらは回避策はあるのでしょうか? そもそもコードを作り直す方がいいのでしょうか。
Y.H.

2020/03/11 08:25

var dstSheets = ss.getSheets(); dstSheets.length が1より大きい場合、  回答記載のdeleteを行い 1の場合、  dstSheets[0].setName("シート1"); とかしてシート名を変更してやるのでどうでしょう。
dell_0

2020/03/13 05:04

ありがとうございます。 ご連絡頂いたコードで動作確認取れました。 勉強になりました。ありがとうございます。
guest

0

Google Spreadsheetを他のファイルで上書きは出来ません。
addFileはフォルダに追加するだけです。

ただし、ファイルがxlsxなどのファイルであるならば可能です。Drive APIをオンにしてDrive.Files.Updateで上書きすることが可能です。

参考:Google Apps Scriptでファイルアップローダを作る

投稿2020/03/11 05:07

officeforest

総合スコア412

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

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

Y.H.

2020/03/11 05:12

Spreadsheet じゃなくて sheet だと思いますよ。
dell_0

2020/03/11 07:49

ありがとうございます。 変更しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問