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

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

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

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

Google Apps Script

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

JavaScript

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

Q&A

解決済

1回答

946閲覧

2つのプレッドシートを相互参照し、行列の挿入削除を含めて同期してデータを編集したい

退会済みユーザー

退会済みユーザー

総合スコア0

Google スプレッドシート

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

Google Apps Script

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

JavaScript

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

0グッド

1クリップ

投稿2023/09/18 05:52

編集2023/09/18 06:18

実現したいこと

2つのプレッドシートを相互参照し、行列の挿入削除を含めてデータを編集したい。

前提

2つのスプレッドシートAとBの間で相互参照をしたいです。
お互いにセルの編集するところまではできた(ネットで見つけたコードを参考にした)のですが、行列の挿入削除がうまくできません。

ネットで見つけたコードはシートを全選択していましたが、私のほうでは部分的に選択(AスプシのデータをBスプシが部分的に参照している)しています。

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

行列の挿入削除を編集と同じようなコードで記述すると、表が崩れてしまい使い物になりません。
Bスプシで行を挿入してもAスプシに反映されない列がある(Bスプシから参照していない列には挿入されない)、Bスプシで行挿入ではなくセル編集をしただけなのにAスプシに部分的に行が挿入されてしまうなど、めちゃくちゃになってしまいます。

該当のソースコード

GAS,JavaScript

1const sourceID = "XXX": 2const sourceSheet = "テストX"; 3const copyID = "YYY"; 4const copySheet = "テストY"; 5 6function importUsername() { 7 const thisSpreadsheet = SpreadsheetApp.openById(sourceID); 8 const thisSheet = thisSpreadsheet.getSheetByName(sourceSheet); 9 const lastRow = thisSheet.getLastRow(); 10 const thisData = thisSheet.getRange(4, 1, lastRow, 1); 11 12 const toSpreadsheet = SpreadsheetApp.openById(copyID); 13 const toSheet = toSpreadsheet.getSheetByName(copySheet); 14 const toRange = toSheet.getRange(4, 1, lastRow, 1); 15 toRange.setValues(thisData.getValues()); 16} 17 18function importData1(){ 19 const thisSpreadsheet = SpreadsheetApp.openById(sourceID); 20 const thisSheet = thisSpreadsheet.getSheetByName(sourceSheet); 21 const lastRow = thisSheet.getLastRow(); 22 const thisData = thisSheet.getRange(4, 10, lastRow, 2); 23 24 const toSpreadsheet = SpreadsheetApp.openById(copyID); 25 const toSheet = toSpreadsheet.getSheetByName(copySheet); 26 const toRange = toSheet.getRange(4, 2, lastRow, 2); 27 toRange.setValues(thisData.getValues()); 28} 29 30function insertRow(){ 31 const thisSpreadsheet = SpreadsheetApp.openById(sourceID); 32 const thisSheet = thisSpreadsheet.getSheetByName(sourceSheet); 33 const myActiveCell = thisSheet.getActiveCell(); 34 const selectedRow = myActiveCell.getRow(); 35 36 const toSpreadsheet = SpreadsheetApp.openById(copyID); 37 const toSheet = toSpreadsheet.getSheetByName(copySheet); 38 toSheet.insertRows(selectedRow); 39 40} 41

試したこと

import~のほうはネットで見つけたコードで、これ自体(セルの相互編集)は問題なくできました。
問題はinsertRowのほうで、insertRows系を全種類を変えてやってみたのですが、期待通りに動いてくれません。どれも表示が崩れてしまいます。
ちなみにすべてトリガーの「編集時」を利用しています。

もしかしてスプシではこういったことは実現不可能なのでしょうか?
ネットで検索しても、相互参照のコードは発見できましたが、行列挿入削除を同期するようなコードは見当たりませんでした。

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

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

まず現状の方法ですと

JavaScript

1 const thisSpreadsheet = SpreadsheetApp.openById(sourceID); 2 const thisSheet = thisSpreadsheet.getSheetByName(sourceSheet);

このようにopenByIdでスプレッドシートを開くと、エディタで開かれているものとは別に新しくスプレッドシートを開きます。
なので、getActiveCellでアクティブなセルを取得してもエディタで現在選択しているセルとは別のセルになってしまいます。(多分A1セルになると思います)
このことにより挿入した行は正確に取得できていません。
ログを出力するなどしてselectedRowの値を確認してみましょう

行列の挿入削除の検出に関してはこちらの質問の回答が参考になるのではないかと思います。
GASのonEdit(e)関数内のe.rangeで取得されるセルについて
ただ、この方法でもあるエリアを選択してセルの挿入を行ったり、削除を行った場合の検出ができるかは分かりません。

投稿2023/09/18 07:04

編集2023/09/18 07:40
YAmaGNZ

総合スコア10465

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

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

退会済みユーザー

退会済みユーザー

2023/09/18 08:48

今ちょっとファイルを確認できないので申し訳ないのですが、openByIdだとまったく別の新しいスプレッドシートを開くのでしょうか?insertRow以外のimportUsernameとimportData1だけなら、仕様通りに相互参照・同期ができています。なので、insertRowでもできると思ったのですが・・・ ですが、確かにselectedRowの値などはまったく確認していませんでした。そのあたり明日確認してみます。 またご紹介の質問、かなり近いことをされているように思いました。 こちらも是非参考にさせていただき、明日確認してみます。 ただ、回答を読むとどうも私のレベルでは難易度が高すぎるようにも思ってしまいます・・・。 とりあえずやるだけやってみます・・・。 ありがとうございます!
YAmaGNZ

2023/09/18 10:08 編集

>openByIdだとまったく別の新しいスプレッドシートを開くのでしょうか? 同じスプレッドシートを別々のブラウザで開いてる感じです。 片方が選択しているセルをもう片方で変更したりできませんよね。 importUsernameなどに関してはgetLastRowと最後の行を取得しているので誰が見ても最後の行を取得できます。 しかしinsertRowのほうは「現在選択している行」を取得しているので開いているものによって別々の状態となります。
YAmaGNZ

2023/09/18 10:16 編集

最終的にやりたいことによっては スプレッドシートA・・・データ入力用シートとして共有する。 スプレッドシートB・・・現在の片方のスプレッドシートだがデータはスプレッドシートAから取得するようにする スプレッドシートC・・・現在の片方のスプレッドシートだがデータはスプレッドシートAから取得するようにする といった構成にするとかで実現できるかもしれませんし、最終的にやりたいことを現在こういった手法で実現しようとしているが他に手段がないか等質問してみるのも手かもしれません。
退会済みユーザー

退会済みユーザー

2023/09/19 03:48

おっしゃる通り、getActiveCellでアクティブなセルが正しく取得できていませんでした。A1セルでした。 なお、シートに関しては、実際に編集しているアクティブシートが返ってきました。 ご紹介していただいた質問の回答は、importUsernameなどを残したままだと動かなくて、そのあたり全部コメントアウトしたら、メッセージボックスは正しく表示されるようになりました。その先の「行列挿入削除」も以下のようなコードで動きました。 case "INSERT_ROW": if (startrow === endrow) { // 1行追加 Browser.msgBox(`行を追加 = ${startrow}行目`); const toSpreadsheet = SpreadsheetApp.openById(copyID); const toSheet = toSpreadsheet.getSheetByName(copySheet); toSheet.insertRows(startrow); } else { // 複数行追加 Browser.msgBox(`行を追加 = ${startrow}行目~${endrow}行目`); // 略 } break; しかし、改めてimportUsernameなどをアンコメントしたら、やっぱりうまく動きません。 なんと表現して良いのか分かりませんが、ランダムな感じで余計な行やセルが入ったり入らなかったりして、やはり「表が崩れる」としか言いようがありません。何度もテストしてみましたが、どうにもなりませんでした。 なお、onChangeを外したimportUsernameなど自体は期待通りに動きます。onChangeのメッセージボックスのセル番号も正しいです。 スプレッドシートABCという構成にすることは、大変申し訳ないのですが、意味が良く分かりません。より複雑になると思うのですが…。 私自身もかなりネットで調べたのですが、手がかりになるような情報も無く、もしかしたらこういうことをやりたい人がいないのかな、技術的にも不可能なのかな、とも思い、こちらで質問させていただきました。 なんとなく、技術的に不可能?そういう使い方を想定していない?ように感じました。 参考になる質問回答をご紹介くださり、大変ありがとうございました。これはこれで別の機会に使えるかもしれません。 相互に編集することは可能なので、それで妥協しようと思います。 重ね重ねありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.38%

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

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

質問する

関連した質問