回答編集履歴

3

こうてい

2022/10/15 14:46

投稿

Cocode
Cocode

スコア2314

test CHANGED
@@ -100,7 +100,13 @@
100
100
 
101
101
  注意としては「コピーされた原本」シートは、スクリプトを実行するたびに毎回一度削除されるということです。
102
102
  このシートに直接変更を加えた場合、その変更は維持されません。削除されます。
103
- なのでなにか加工を加える場合は、「コピーされた原本」とは別にシートを作成し、「コピーされた原本」の内容を複製の上、編集してください。
103
+ なのでなにか加工を加える場合は、「コピーされた原本」とは別にシートを作成し、「コピーされた原本」の内容を複製(以下、「編集用シート」)の上、編集してください。
104
+
105
+ つまり運用方法としては、
106
+ 1. 自分のスプシを開いたら毎回メニューバーのカスタムメニュー「原本のシートを複製」で原本を複製する(「コピーされた原本」シートが新規作成される)。
107
+ 2. 「コピーされた原本」を「編集用シート」にコピーする(こちらの処理も、カスタムメニューとして登録できます)。
108
+
109
+ 上記2工程を、1つの工程としてカスタムメニューに登録することも可能です。
104
110
 
105
111
  ---
106
112
 

2

id

2022/10/15 14:28

投稿

Cocode
Cocode

スコア2314

test CHANGED
@@ -102,3 +102,10 @@
102
102
  このシートに直接変更を加えた場合、その変更は維持されません。削除されます。
103
103
  なのでなにか加工を加える場合は、「コピーされた原本」とは別にシートを作成し、「コピーされた原本」の内容を複製の上、編集してください。
104
104
 
105
+ ---
106
+
107
+ スプレッドシートのIDとは、以下の部分のことです。
108
+ ```javascript
109
+ https://docs.google.com/spreadsheets/d/[この部分がID]/edit#gid=1234567890
110
+ ```
111
+

1

別スプシから複製

2022/10/15 14:26

投稿

Cocode
Cocode

スコア2314

test CHANGED
@@ -43,3 +43,62 @@
43
43
 
44
44
  - 今回は、コピー元の全範囲を、同じ範囲・位置でコピー先に出力されるようなコードを書きましたが、出力先のセルはカスタマイズ可能です。
45
45
  - また、編集時にコピーが実行されるようにしましたが、メニューバー(スプレッドシートの上部にあるツールとか表示とかのメニュー部分)にカスタムメニューを追加し、例えば「書式をコピー」という項目をクリックした時に実行するようにすることも可能です。
46
+
47
+ ---
48
+
49
+ ### 別のスプレッドシートから自分のスプレッドシートに複製
50
+
51
+ 補足情報をうけて、対策を追加します。
52
+
53
+ まず最初に、原本のスプレッドシートの変更を自動で検知するというのは不可能のようです。
54
+ 編集を検知して実行される`onEdit()`関数を使用するためには、原本のスプシにバインドする形でGASを作成しなければならないからです。
55
+ 原本に編集権限のない質問者様には、原本上でGASを作成できません。
56
+
57
+ 代替案として、原本のシートを丸々複製するGASを組んでみました。
58
+ 処理内容としては、
59
+
60
+ 1. メニューバーにカスタムメニューを生成
61
+ 2. 生成されたメニュー「原本のシートを複製」をクリックする
62
+ 3. 原本のスプシのシートが自分のスプシの中に新規シートとして複製される
63
+
64
+ ```javascript
65
+ function onOpen() {
66
+ // 自分のスプシを開いた時に、カスタムメニューを生成
67
+ const customMenu = SpreadsheetApp.getUi();
68
+ customMenu.createMenu('カスタムメニュー')
69
+ .addItem('原本のシートを複製', 'copySheetFromAnotherSS')
70
+ .addToUi();
71
+ }
72
+
73
+ /*
74
+ * 別スプシのシートを、自分のスプシに複製する関数
75
+ */
76
+ function copySheetFromAnotherSS() {
77
+ // 原本(コピー元)のシートを取得
78
+ const originalSs = SpreadsheetApp.openById('*********原本のスプシのID*********’);
79
+ const originalSheet = originalSs.getSheetByName('コピー元');
80
+
81
+ // 自分のスプシ(コピー先)を取得
82
+ const targetSs = SpreadsheetApp.openById('*********自分のスプシのID*********’);
83
+
84
+ // シートを複製
85
+ const newSheet = targetSs.getSheetByName('コピーされた原本');
86
+ if (newSheet) { // 「コピーされた原本」という名前のシートが自分のスプシの中にあったら
87
+ targetSs.deleteSheet(newSheet); // それを削除
88
+ }
89
+ originalSheet.copyTo(targetSs).setName('コピーされた原本'); // 別スプシのシートを自分のスプシに「コピーされた原本」というシート名で複製
90
+ }
91
+ ```
92
+ ↓原本のスプシ(質問者様に編集権限がない別スプシ)
93
+ ![原本](https://ddjkaamml8q8x.cloudfront.net/questions/2022-10-15/70111ee6-5012-4051-8090-27cd7b411c47.png)
94
+
95
+ ↓質問者様のスプシ
96
+ ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-10-15/254d0b3e-caf2-43e8-af60-9b5659d51035.png)
97
+
98
+ 自分のスプシに複製されたシートはもちろん編集権限のあるものですので、自由に編集していただけます。
99
+ 先にご紹介したコードを使い、自分のスプシ内でさらに別のシートに値や書式をコピーするなど、ご自由に運用してください。
100
+
101
+ 注意としては「コピーされた原本」シートは、スクリプトを実行するたびに毎回一度削除されるということです。
102
+ このシートに直接変更を加えた場合、その変更は維持されません。削除されます。
103
+ なのでなにか加工を加える場合は、「コピーされた原本」とは別にシートを作成し、「コピーされた原本」の内容を複製の上、編集してください。
104
+