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

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

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

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

Q&A

解決済

2回答

973閲覧

スプレッドシートで元からあるシートをコピーして、指定のリストの指定のセルの文字をシート名として付け直したい

-syo

総合スコア4

Google スプレッドシート

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

0グッド

0クリップ

投稿2020/11/13 05:40

編集2020/11/13 06:03

前提・実現したいこと

お世話になります。
タイトル通り、Googleスプレッドシートで
①管理リストに入力があった場合、原本シートをコピーしてシートを作成する
②作成したシートに入力された行の指定のセルの中身をシート名として入力する
(セルの中にはif関数が入っています、指定の別セルに何もなければ空白、何か文字が入れば2つのセルの中身を繋げて表示させています)

今まではエクセルで、リストに記入(1~複数行)して、ボタンを押すとリストとして用意しているシート(Aシート)の指定の行の中(G列)で同じ内容がなければ、原本として用意しているシート(Bシート)をコピーして新規シートを作成し、そこにAシートG列のまだ作られていないシート名のシートを作成する、と言う物を使っていました。

今後、Googleスプレッドシートにて同様の作業を行う必要があり、エクセルで使っていたコードを引っ張ってきましたが、
そのままでは動かず、取り急ぎ
・指定の列に新規で入力された段階で原本として用意しているシートをコピーして新規のシートを作成する
・そのシートに指定の列の最終行の文字列を引っ張って来て名前を付け直す
を行おうとしています。

コピーまでは問題なくいくのですが、名前の付け直しがどういじっても上手くいかず、エラーが出てしまいます。
エラーの内容で検索してみても、解決出来る情報に行きあたらず、行き詰っております。
下記のコード以外にも書き換える名前の指定方法を変えたり(名前になるセルの取得を別の塊にする)などしているのですが、
全て、名前を付ける際の指定方法が悪いようなエラーが出てしまいました。

プログラムの基礎も分かっておらず、穴だらけの知識で手探りで組み立てている為、
どこから直せばいいのか、何が余分で何が抜けているのかもわかっておりません。
申し訳ありませんが、どなたかお力添え頂けないでしょうか。

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

Cannot read property 'rename' of undefined

該当のソースコード

function myFunction() { newsheet(); } function Copy(){ // 現在のスプレッドシートの取得 var ss_active_all = SpreadsheetApp.getActiveSpreadsheet(); // 書出シートの作成(原本のコピー作成) var ss_sheet_temp = ss_active_all.getSheetByName("原本"); var ss_sheet_copy = ss_sheet_temp.copyTo(ss_active_all); } function newsheet(){ var ss_sheet = Copy(); var ss_obj = SpreadsheetApp.getActiveSpreadsheet(); var ss_sheet_XX = ss_obj.getSheetByName("一覧"); // 探索したいシート名を入力 var ss_range = ss_sheet_XX.getRange("G:G").getValues(); var row_last_num = ss_range.filter(String).length; var name = row_last_num; ss_sheet.rename(name); }

試したこと

エラーの内容で検索
コピーから名前の変更までを1つのfunctionキーワード?にする
名前を取得する為の動作を別functionキーワード?にする

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

JavaScript

1Cannot read property 'xxx' of undefined

というのは、GASで使用するJavaScriptで頻出するエラーです。

意味はそのままでundefinedxxxとうプロパティを読み取れないということです。(JavaScriptにはundefinedという何も定義されていないという意味の未定義値があります。VBAでいうNothingが近い。)エラーメッセージからxxxプロパティを持っているオブジェクトがundefinedになっていることがわかります。

Cannot read property of undefined等でググると解説記事はがたくさん出てきます。


今回の問題の場合、ss_sheetの値がundefinedになっているということです。ソース見るとss_sheetCopy()の戻り値を代入していますが、Copy()は何もリターンしていないのがエラーの原因です。

ただss_sheetSheetオブジェクトを期待しているようですが、その場合シート名の変更はrenameでえはなくsetNameで行います。

  • Sheet.setName

https://developers.google.com/apps-script/reference/spreadsheet/sheet#setnamename

投稿2020/11/13 06:31

編集2020/11/13 06:33
draq

総合スコア2577

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

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

-syo

2020/11/13 09:09

ありがとうございます。 どこを削ってエラーメッセージをググるべきなのか分からずそのまま検索して探していました。 また、renameとsetNameに関しても、勘違いをしたまま組み合わせていたようです。 無事解決いたしました、ありがとうございます!
guest

0

ベストアンサー

  • Copyが値を返していないので、ss_sheetにundefinedが入る。
  • シート名の変更はrenameではなくsetNameを使う。renameは文書(スプレッドシート)の名前変更用。
  • G列に含まれる文字列の個数をfilterで調べ、それをそのままシート名に設定しようとしている。getValuesで得た2次元配列から、文字列を取り出す必要がある。添え字は0オリジンなので、個数 - 1を最初の添え字に指定する必要がある。文字列を取り出すには、さらにもうひとつ添え字0が必要。

GAS

1function myFunction() { 2 var ss = SpreadsheetApp.getActiveSpreadsheet(); 3 var copied_sheet = ss.getSheetByName("原本").copyTo(ss); 4 var values = ss.getSheetByName("一覧").getRange("G:G").getValues(); 5 var name = values[values.filter(String).length - 1][0]; 6 copied_sheet.setName(name); 7}

投稿2020/11/13 06:31

編集2020/11/13 06:32
Daregada

総合スコア11990

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

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

-syo

2020/11/13 09:17 編集

ありがとうございます! 無事、解決しました! 頂いたコードそのままだと、シート名に空白は指定できません、と言うエラーが出た為、 少し調べてみて、 var name = values[values.filter(String).length - 1][0]; を var name = values[values.filter(String).length][0]; に書き換えてみたら思った通りの挙動をしてくれました。 多分、大本のシートの作成からしておかしいのだと思います、ありがとうございます。 そもそもの指定も間違っていたんですね…最初はsetNameで指定していたんですが、どうしてもエラーを出すので、新しいシートを作っている訳ではなく既存のシートをコピーしているので、setName(名前を付ける)ではなくrename(名前を変更する)なのでは、と勘違いしてそのまま進んでいました。 あんなだらだらとしたコードをすっきりまとめて頂いて助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問