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

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

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

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

Google Apps Script

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

JavaScript

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

Q&A

解決済

1回答

282閲覧

IMPORTRANGEでは色や幅なども変更できない為GASを利用して可能にしたい

ttt3814ttt

総合スコア1

Google スプレッドシート

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

Google Apps Script

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

JavaScript

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

0グッド

1クリップ

投稿2024/12/04 15:05

編集2024/12/07 14:15

●前提
GASを利用したことが無くどうにかしてマクロ?を可能であれば作っていただきたいです。

●実現したいこと
シフトをスプレッドシートで作成しているのですが、
社員向けのスプレッドは個人情報もあり
アルバイト向けに渡しているスプレッドは別であり
毎回どちらも変更(社員向けを変更しコピペでアルバイト用も変更している)ためその手間をなくしたいと思い
IMPORTRANGEというものを調べて知り作成しようとしたが、
私の作るシフトは
・部署ごとで色を変えたりシフト変更があった場合に色をわかりやすく変えている
・メンバーの入れ替わりがあったりするので行や列を増やしたり減らしたりすることがある
それも一緒に変更したいと思っています。

●発生している問題・エラーメッセージ・該当のソースコード・自分で調べて試したこと
似た質問を参照(https://teratail.com/questions/l5jrco4fe1ckyl)に実行をしてみましたが、

function onEdit() { autoCopy(); } function autoCopy() { // スプレッドシートを取得 const ss = SpreadsheetApp.getActiveSpreadsheet(); // 原本(コピー元)のデータのある全範囲を取得 const originalSheet = ss.getSheetByName('コピー元'); const originalRange = originalSheet.getDataRange(); const lastRow = originalSheet.getLastRow(); const lastCol = originalSheet.getLastColumn(); // コピー先とデータを出力する範囲を取得 const targetSheet = ss.getSheetByName('コピー先'); const targetRange = targetSheet.getRange(1, 1, lastRow, lastCol); // 値と書式をコピー originalRange.copyTo(targetRange); }

を実行

【エラーメッセージ】
TypeError: Cannot read properties of null (reading 'getDataRange')
autoCopy @ コード.gs:11
onEdit @ コード.gs:2

がでてきて実行できません。
知識がなくエラーに対する是正ができずに困っています。

●また、可能であれば
シートを1月から12月まで12個作るためシートも新しく作成するとコピー側も作られて同様の編集が行えれていると尚嬉しいです。

●上記の事でできない場合
・指定したメンバー以外(アルバイト)はシートを開けないようにする方法が知りたいです。
・シートの中でも表示される場所を固定できるのであれば、アルバイトには見えない範囲を作りたい。

イメージ説明

補足
・社員が閲覧できるスプレッドをA、アルバイトが閲覧できるスプレッドをBで記載していただけると嬉しいです!
・アルバイトに共有するスプレッドの内容はシフトのシートはそのまますべてを共有して、別のシートに有給の残量だったり個人情報が書いてあるため分けたい or シートを表示できるメンバーが限れるのであれば限りたいです。

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

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

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

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

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

YellowGreen

2024/12/05 03:45

エラーについて… 原本のシート名は コピー元 という名前でしょうか
kikukiku

2024/12/05 04:21

スプレッドシートは、ページ単位に閲覧制限をかけることができません。 よって、アルバイト用スプレッドシートと、社員用スプレッドシートに 分ける方針は、維持した方が良いです。 コピー方法ですが、コピーが簡単になるように、 レイアウト構成を考えた方が良いです。 レイアウト構成が提示されていないため、具体的にどのように変更した方が良いかは アドバイスできません。 例えば、こんな構成になっていればコピーしやすいとは思います。 ・社員用スプレッドシートのみを編集。 ・列Aから列Dまでが社員用、列Eから列Fまでがアルバイト用とする。 ・社員用スプレッドシートを編集後、コピーマクロを実行すると、  社員用スプレッドシートの列Eから列Fまでをアルバイト用スプレッドシートにコピーする。
ttt3814ttt

2024/12/07 13:16

原本のシート名は コピー元 という名前でしょうか →こちらはシートのURLを張り付けました! 社員用スプレッドシートには社員もアルバイトも同じシフトが入っているので 片方のスプレッドを編集するともう一つのスプレッドが変わるようにしたいです。
guest

回答1

0

ベストアンサー

ご希望の動作がよくわかりませんが、
Aでいずれかの月のシートの修正が終わった時点で
その月のシートを開いたまま
ヘルプの右隣のメニューからスクリプトを実行すると
Bの同月のシートがAで開いている月のシートと同じ内容になります
(もしBに同じ月のシートがなかったらBに新たに追加されます)

という動作でよければ…
次のコードを参考にしてください

コードのXXXXXの部分をBのIDで書き換えてから
実行してください
IDとは、Bのシートを開いた時のURL欄の
https://docs.google.com/spreadsheets/d/1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/edit?gid=0123456789

1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
の部分です

JavaScript

1// Aで開いているシートをBに同じ名前でコピペ(または置換) 2function copySheet() { 3 // * 初期設定 * 4 // BのID(↓引用符の中にBのIDをコピペ) 5 const B_ID = '1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'; 6 7 // 開いているAのシートをBにコピペ 8 // 同じ名前のシートがあったら置換 9 const A = SpreadsheetApp.getActiveSpreadsheet(); 10 const B = SpreadsheetApp.openById(B_ID); 11 const sheetInA = A.getActiveSheet(); 12 const nameSheetInA = sheetInA.getName(); 13 const sheetTemp = sheetInA.copyTo(B); 14 const sheetInB = B.getSheetByName(nameSheetInA); 15 if (sheetInB) { 16 const index = sheetInB.getIndex(); 17 B.deleteSheet(sheetInB); 18 sheetTemp.activate(); 19 B.moveActiveSheet(index); 20 } 21 sheetTemp.setName(nameSheetInA); 22} 23 24// メニューのヘルプの右に新たなメニューを作成 25function onOpen() { 26 const ui = SpreadsheetApp.getUi(); 27 ui.createMenu('シートのコピペ') 28 .addItem('開いているシートをBにコピペ', 'copySheet') 29 .addToUi(); 30}

なお、
このスクリプトを保存した後で、
Aを一度閉じてから再度開くと
次の画像のようにヘルプの隣にメニューができますので、
1ヶ月分のシフト表の修正が終わったら、そのシートを閉じる前に
メニューからスクリプトを実行すると B にコピペされます

メニューの表示

投稿2024/12/06 12:41

編集2024/12/07 22:23
YellowGreen

総合スコア841

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

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

ttt3814ttt

2024/12/07 13:38

ありがとうございます! 「修正したシートでアルバイト向けのスプレッドシートの同じ名前のシートが置き換わる」 とはつまりどういうことでしょうか?頭が悪くてすみません;;;
YellowGreen

2024/12/07 22:03 編集

当方も、読解力不足でご希望の動作が よくわからないままで… > 「修正したシートでアルバイト向けのスプレッドシートの同じ名前のシートが置き換わる」 > とはつまりどういうことでしょうか Aの1月シート(※)がBに1月シートとしてコピペされます コピペ前にBに1月シートがあったらコピペ後は Aの1月シートと全く同じ内容になります (※ 実行時に開いているシートがコピペ元) スクリプトをご提示したので、 お試しいただいて…
YellowGreen

2024/12/07 18:07

> ・社員が閲覧できるスプレッドをA、アルバイトが閲覧できるスプレッドをBで記載していただけると嬉しいです! コードをそのように修正しました
ttt3814ttt

2024/12/09 06:39

ありがとうございます! 「Aを書き換えることでBのシートが置き換わる」 って意味でしたのでこちらの方法ためしてみます!
ttt3814ttt

2024/12/09 07:30

本当にありがとうございます! 試してみたところできました!! メンバーとキャッキャできてるのでいろいろと問題は上がりそうですが活用させていただきます! ベストアンサーに選ばせていただきました。 また機会ありましたらよろしくお願いします!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.34%

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

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

質問する

関連した質問