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

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

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

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

Google Apps Script

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

8987閲覧

【スプレッドシート】コピー元(太字、背景色ありなどの書式が設定されている)が更新された時、コピー先も自動で更新されるようにするには?

ysokyuk

総合スコア1

Google スプレッドシート

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

Google Apps Script

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2022/10/14 10:14

編集2022/10/14 10:22

前提

表題の通りです。
スプレッドシートの標準関数であるimportrangeを試したのですが、データだけではなく書式も更新したいのですが、どのようにしたらいいのか知りたいです。

業務でスプレッドシートを扱う機会が多く、原本(コピー元)を更新する機会が多いので、コピー先も原本が更新されるたびに、コピー先を削除してまた原本をコピーしてシート作成するのがわずらわしいです…。

実現したいこと

原本が更新された時、コピー先も自動更新できるようにしたい。
その際、データだけではなく書式や行の固定設定も引き継ぎされたい。
イメージ説明

原本の色や書式そのまま別シートにインポートできれば…

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

importrange関数で原本のデータは取得できているが、書式などが取得されていない。

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

GASなどを用いて上記の悩みが解決できる関数などを自作することが可能でしょうか?
できなさそうであれば、できないと教えていただけると嬉しいです。
また可能であればどのように作成したらいいでしょうか?
(こちらは手順だけ教えてくださればあとは自分で考えて作成します!)

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

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

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

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

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

guest

回答2

0

現時点では、スクリプトを使用しても、IMPORTRANGEと同等の動作(「リンク元が編集された時に、自動的にリンク先にも編集内容を適用」)を、書式にまで適用することは不可能です。

なぜなら、参照元の書式が編集されたことを検知できないからです。
また、設定先の数式を力技で解析してリンク元をすべて把握する、というのも現実的ではありません。
そもそも参照元に対して読み取り権限がないとのことですから、スクリプトやトリガーを参照元に対して設定することも不可の状況と思われ、この時点でとりうる手段はほぼ詰んでいます。

また「表のリンク貼り付けを使えるじゃないか」という人がいるかもしれませんが、Google スプレッドシートの表のリンクは、エクセルのそれと異なり、編集元が更新されても自動で更新されません。
リンクされた表を更新するには、メニューの図形描画から更新する必要があり、非常に手間がかかるため同等とは言えません。またこの更新動作をスクリプトで行うことも現時点ではできません。

スクリプトを使って何かボタンかメニューを押したら参照元シートの全セルの書式(または指定した範囲の書式)をコピーする、といったやり方はできるかもしれませんが、質問者さんの題意(「原本が更新された時(=更新されたことをトリガーとして)、コピー先も自動更新できるようにしたい。その際、データだけではなく書式や行の固定設定も引き継ぎされたい。」)を満たしていないと思われます。

投稿2022/10/15 03:23

編集2022/10/16 06:38
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ベストアンサー

GASで書式をコピーする方法があります。
動作確認のために書いたコードを紹介します。↓↓

書式と値をコピー

javascript

1function onEdit() { 2 autoCopy(); 3} 4 5function autoCopy() { 6 // スプレッドシートを取得 7 const ss = SpreadsheetApp.getActiveSpreadsheet(); 8 9 // 原本(コピー元)のデータのある全範囲を取得 10 const originalSheet = ss.getSheetByName('コピー元'); 11 const originalRange = originalSheet.getDataRange(); 12 const lastRow = originalSheet.getLastRow(); 13 const lastCol = originalSheet.getLastColumn(); 14 15 // コピー先とデータを出力する範囲を取得 16 const targetSheet = ss.getSheetByName('コピー先'); 17 const targetRange = targetSheet.getRange(1, 1, lastRow, lastCol); 18 19 // 値と書式をコピー 20 originalRange.copyTo(targetRange); 21}
  • onEdit()関数の中に書いたものは、シートが編集された時に自動で実行されます。なので、autoCopy()という関数を作って、編集時にそれが実行されるようにしてみました。
  • copyTo()メソッドで、値と書式の両方がコピーされます。

書式のみコピー

javascript

1 // 書式のみコピー 2 // (書式のみの変更だけでは反映されない。値が更新されたときに書式のみコピーされる) 3 originalRange.copyTo(targetRange, {formatOnly: true});
  • copyTo()メソッドのオプションにformatOnly: trueを書くことで、書式のみコピーされます。
  • ただし注意があり、おそらくonEdit()関数は、セルの値が編集されたときのみ発動されるようで、書式のみの編集では反映せず、書式の変更は反映されません。

  • 今回は、コピー元の全範囲を、同じ範囲・位置でコピー先に出力されるようなコードを書きましたが、出力先のセルはカスタマイズ可能です。
  • また、編集時にコピーが実行されるようにしましたが、メニューバー(スプレッドシートの上部にあるツールとか表示とかのメニュー部分)にカスタムメニューを追加し、例えば「書式をコピー」という項目をクリックした時に実行するようにすることも可能です。

別のスプレッドシートから自分のスプレッドシートに複製

補足情報をうけて、対策を追加します。

まず最初に、原本のスプレッドシートの変更を自動で検知するというのは不可能のようです。
編集を検知して実行されるonEdit()関数を使用するためには、原本のスプシにバインドする形でGASを作成しなければならないからです。
原本に編集権限のない質問者様には、原本上でGASを作成できません。

代替案として、原本のシートを丸々複製するGASを組んでみました。
処理内容としては、

  1. メニューバーにカスタムメニューを生成
  2. 生成されたメニュー「原本のシートを複製」をクリックする
  3. 原本のスプシのシートが自分のスプシの中に新規シートとして複製される

javascript

1function onOpen() { 2 // 自分のスプシを開いた時に、カスタムメニューを生成 3 const customMenu = SpreadsheetApp.getUi(); 4 customMenu.createMenu('カスタムメニュー') 5 .addItem('原本のシートを複製', 'copySheetFromAnotherSS') 6 .addToUi(); 7} 8 9/* 10 * 別スプシのシートを、自分のスプシに複製する関数 11 */ 12function copySheetFromAnotherSS() { 13 // 原本(コピー元)のシートを取得 14 const originalSs = SpreadsheetApp.openById('*********原本のスプシのID*********); 15 const originalSheet = originalSs.getSheetByName('コピー元'); 16 17 // 自分のスプシ(コピー先)を取得 18 const targetSs = SpreadsheetApp.openById('*********自分のスプシのID*********); 19 20 // シートを複製 21 const newSheet = targetSs.getSheetByName('コピーされた原本'); 22 if (newSheet) { // 「コピーされた原本」という名前のシートが自分のスプシの中にあったら 23 targetSs.deleteSheet(newSheet); // それを削除 24 } 25 originalSheet.copyTo(targetSs).setName('コピーされた原本'); // 別スプシのシートを自分のスプシに「コピーされた原本」というシート名で複製 26}

↓原本のスプシ(質問者様に編集権限がない別スプシ)
原本

↓質問者様のスプシ
イメージ説明

自分のスプシに複製されたシートはもちろん編集権限のあるものですので、自由に編集していただけます。
先にご紹介したコードを使い、自分のスプシ内でさらに別のシートに値や書式をコピーするなど、ご自由に運用してください。

注意としては「コピーされた原本」シートは、スクリプトを実行するたびに毎回一度削除されるということです。
このシートに直接変更を加えた場合、その変更は維持されません。削除されます。
なのでなにか加工を加える場合は、「コピーされた原本」とは別にシートを作成し、「コピーされた原本」の内容を複製(以下、「編集用シート」)の上、編集してください。

つまり運用方法としては、

  1. 自分のスプシを開いたら毎回メニューバーのカスタムメニュー「原本のシートを複製」で原本を複製する(「コピーされた原本」シートが新規作成される)。
  2. 「コピーされた原本」を「編集用シート」にコピーする(こちらの処理も、カスタムメニューとして登録できます)。

上記2工程を、1つの工程としてカスタムメニューに登録することも可能です。


スプレッドシートのIDとは、以下の部分のことです。

javascript

1https://docs.google.com/spreadsheets/d/[この部分がID]/edit#gid=1234567890

投稿2022/10/14 18:18

編集2022/10/15 14:46
Cocode

総合スコア2314

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

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

ysokyuk

2022/10/15 02:03

Cocodeさん コードのご記載、ありがとうございます! とても詳細に説明までいただき、わかりやすかったです。 こちらのコードで、スプレッドシートの書式と値が自動更新できるのは理解できました。 ただ前提として下記の条件が抜けておりました。 申し訳ございません。 ・コピー元とコピー先のシートが別のスプレッドシート ・自分にコピー元の編集権限がない(閲覧しかできない) ・オーナーがコピー元の編集を行うと、自分の所有しているシートも更新されるイメージ  (コピー先だけに処理を追加して実現できるのであれば有難いです。) 質問に上記内容を盛り込むべきでした。 こちらの条件を踏まえた上で解決できそうか知見をいただけないでしょうか? すみませんが、よろしくお願いします!
Cocode

2022/10/15 13:23

検証してみます!
ysokyuk

2022/10/19 10:50

Cocodeさん 返信遅くなり大変申し訳ございませんでした。 Cocodeさんにご提供いただいたGASが実際に業務で運用が可能となりましたのでとても助かりました! 追加補正もして頂き、感謝してもしきれません! この度は知見を頂き本当にありがとうございました!
ysokyuk

2022/10/19 10:50

上記質問となっているのですが返信不要です!
Cocode

2022/10/19 10:59

わーよかったですー!丁寧なお礼ありがとうございます😭
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問