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

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

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

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

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

Q&A

解決済

1回答

298閲覧

シートコピー後にシート名をセルに表示したい

hitct2460

総合スコア10

Google Apps Script

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

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

0グッド

1クリップ

投稿2024/07/01 12:41

編集2024/07/02 00:31

実現したいこと

とあるリストにある文字列をシート名に変更してスタイルはとあるシート通りにコピーするGASを組みました。
コピー元のシート名は「BAG FNL」なので順序としては
「BAG FNL」のコピーが出来上がる

「BAG FNLのコピー」というシート名をリスト通りに変更する

これを最後まで繰り返す

ここまでは成功してます。

GAS

1function create_sheet() { 2 // アクティブシートを取得 3 const spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 4 5 // シートのコピーを作るリストのあるシートを取得 6 const listSheet = spreadsheet.getSheetByName('FLT LIST'); 7 8 // コピー元のシートを取得 9 const formatSheet = spreadsheet.getSheetByName('BAG FNL'); 10 11 // スプレッドシートのURLを取得 12 const spreadsheetUrl = spreadsheet.getUrl(); 13 14 for (let i = 0; i < listSheet.getLastRow() - 1; i++) { 15 // A列に設定しているシート名を取得 16 let name = listSheet.getRange(i + 2, 1).getValue(); 17 18 // 同名のシートがある場合はシートの複製を行わない。 19 if (is_same_sheet_name_(spreadsheet.getSheets(), name)) { 20 Logger.log("not create sheet " + name); 21 continue; 22 } 23 24 // コピー元のシートを複製 25 let newSheet = formatSheet.copyTo(spreadsheet); 26 27 // シート名を設定 28 newSheet.setName(name); 29 30 // シート名の隣の列(B列)にリンクを作成 31 listSheet.getRange(i + 2, 2).setValue('=HYPERLINK("' + spreadsheetUrl + '#gid=' + newSheet.getSheetId() + '", "リンク")'); 32 33 Logger.log('create sheet ' + newSheet.getName()); 34 } 35 36 37 38/** 39 * 同名のシートがあるかを返却します。 40 * @param {Sheet[]} シート名の配列 41 * @param {String} シート名 42 * @return {boolean} true:同名のシートあり、false:同名のシートなし 43 */ 44function is_same_sheet_name_(sheets, name) { 45 for (let i = 0; i < sheets.length; i++) { 46 if (sheets[i].getName() == name) { 47 return true; 48 } 49 } 50 return false; 51} 52} 53 54function GET_FILE_NAME() 55{ 56 return SpreadsheetApp.getActiveSpreadsheet().getName(); 57} 58// スプレッドシートのシート名を取得 59function GET_SHEET_NAME() 60{ 61 return SpreadsheetApp.getActiveSpreadsheet().getSheetName(); 62}

発生している問題・分からないこと

最後に出来がった各シート名をA1に反映したいので元のシートA1に「=GET_SHEET_NAME()」と入力。下記GASで実行。すると全部A1は「BAG FNLのコピー」と表示されます。
これを変更されたリスト通りのシート名を表示したい場合どのようにすればよろしいでしょうか。
ご教示願います。

該当のソースコード

特になし

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

すると全部A1は「BAG FNLのコピー」と表示されます。

補足

特になし

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

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

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

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

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

jimbe

2024/07/01 14:03

GAS は java ではありませんので、 java のタグは外してください。
hitct2460

2024/07/02 02:28

コメントありがとうございます。質問を修正したのでご確認よろしくお願いいたします。
jimbe

2024/07/02 04:55

編集ありがとうございます。
guest

回答1

0

ベストアンサー

カスタム関数の値は全て同じシート名(アクティブシート名)で更新されるので、
次の修正でどうですか。

js

1 // シート名を設定 2 newSheet.setName(name); 3/* ---- 以下の2行を追加 ---- */ 4 // シート名を記入 5 newSheet.getRange('A1').setValue(name);

投稿2024/07/02 10:26

編集2024/07/03 09:26
codemaker

総合スコア89

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

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

hitct2460

2024/07/03 00:59

回答ありがとうございます。試してみましたが解決できませんでした。
codemaker

2024/07/03 09:27 編集

回答内容を変更しました。 カスタム関数ではなく、 スクリプト内でシート名を変更した時に セルにも変更後のシート名を記入してしまうことは ご希望の処理ではないのかもしれませんが、 シート名を直接記入するコードにしてみました。 カスタム関数のままだと、 return SpreadsheetApp.getActiveSpreadsheet().getSheetName(); なので、 関数が更新されたときに たまたまアクティブだったシート名が 全てのシートのA1セルに 表示されることになると思います。
hitct2460

2024/07/04 00:55

回答ありがとうございます。 試したところ問題が解決しました! ベストアンサーに選ばせていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.40%

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

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

質問する

関連した質問