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

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

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

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

Google Apps Script

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

Q&A

解決済

2回答

658閲覧

【GAS】CopyToでセルの関数も引き継ぐ

gomasan

総合スコア96

Google スプレッドシート

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

Google Apps Script

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

0グッド

0クリップ

投稿2022/05/13 03:06

編集2022/05/13 04:31

前提

GASで業績管理シートを作成しています。

実現したいこと

全体集計シートに年月の列の追加と、元となるtmpのセルの関数の引継ぎ

【全体の流れ】
①設定シートにある「月別シート追加」ボタンを押して月別シートを新規作成(例:2205)
→tmpシートを元に月別シート(シート名は①で指定)を作成
②全体集計シートにも①で入力した年月(=シート名)の行を新規追加
→名前ラベルで設定している「C_年月tmpラベル」の行の情報を元に、その1行上に新規作成
→その際にセルに入っている関数も引き継ぐ

※①の流れは実装できているためここには載せていません。

イメージ説明

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

・1行上に値が入らない
・関数が引き継がれない

該当のソースコード

//名前ラベルで設定 const C_ADD_MONTH_ROW_INIT = "C_年月tmpラベル"  // 年月追加 function btnAddMonth_Click(){ const ss = SpreadsheetApp.getActiveSpreadsheet(); const sh = ss.getSheetByName('全体集計'); const insRow = ss.getRangeByName(C_ADD_MONTH_ROW_INIT).getRow()-1; const temp_sh = ss.getSheetByName('month_tmp'); Logger.log(insRow) let strInputMonth = Browser.inputBox("追加する年月を入力してください。", "例:2205", Browser.Buttons.OK_CANCEL); if (strInputMonth === "cancel" || strInputMonth === ""){ Browser.msgBox ("年月名が不明です"); return; }   sh.insertRowsBefore(insRow-1, 1); sh.getRange(ConvertToLetter(Number(insRow+1)) +':'+ConvertToLetter(Number(insRow+1))) .copyTo(sh.getRange(ConvertToLetter(insRow) +':'+ConvertToLetter(Number(insRow))) , SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false); sh.getRange(insRow+1, 1).setValue(strInputMonth); //シートのコピー const copy_month = temp_sh.copyTo(ss) ; copy_month.setName(strInputMonth); copy_month.activate(); copy_month.getRange('A1').setValue(strInputMonth); Browser.msgBox ("年月ファイルを追加しました。"); };

試したこと

insRowの+や-を変えてみましたがうまくいきませんでした・・
ちなみに上記のコードで行うと、2行上に行が追加されて、値は1行上(追加された行の1行下)でかつA列の値(月別シート作成時に指定した年月の値)のみ反映されています

よろしくお願いいたします。。

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

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

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

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

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

gomasan

2022/05/13 04:58

``` const insRow = ss.getRangeByName(C_ADD_MONTH_ROW_INIT).getRow(); ・・・省略・・・ sh.insertRowsBefore(insRow, 1); sh.getRange(ConvertToLetter(Number(insRow+1)) +':'+ConvertToLetter(Number(insRow+1))) .copyTo(sh.getRange(ConvertToLetter(insRow) +':'+ConvertToLetter(Number(insRow))) , SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false); sh.getRange(insRow, 1).setValue(strInputMonth); ``` 上記で1行上に行追加+A列に年月名の記載までできました。ただ関数の引き継ぎまではできておりません。。
guest

回答2

0

自己解決

・1行上に値が入らない
上記が解決できました。

  sh.insertRowsBefore(insRow, 1);
sh.getRange(insRow+1, 1, 1, 11)
.copyTo(sh.getRange(insRow, 1, 1, 11)
, SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
sh.getRange(insRow, 1).setValue(strInputMonth);

上記で解決できました。ConvertToLetterの書き方は別で使っているシートからコピペしてきたやり方でして、コピー元は列も行も変動があるものでした。今回作るものは列数と行数は固定でしたので、行だけ変数にしたらできました。

ただ「関数が引き継がれない」の部分がまだ解決していないので、改めて質問させていただきます。

投稿2022/05/13 05:25

gomasan

総合スコア96

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

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

0

insRow = ss.getRangeByName(C_ADD_MONTH_ROW_INIT).getRow()-1;
でマイナス1しているので、
insRawはtmpの一つ前の行を指していることになります。

ここは-1しなくてよいのではないでしょうか?

投稿2022/05/13 03:48

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

gomasan

2022/05/13 04:16

ご指摘有難うございます。 insRow = ss.getRangeByName(C_ADD_MONTH_ROW_INIT).getRow(); で実装してみたところ、tmpの行に上書きされる形になりました・・A列のtmpが新規追加した値に入れ替わっています。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問