[Google Apps Script] スプレッドシートのカーソルの当たっているセルのRangeを取得する方法:getActiveCellについて

5,887 views
Skip to first unread message

pochi0220

unread,
Jul 3, 2011, 11:42:27 AM7/3/11
to Google Apps API Japan
こんにちは。
getActiveCellについて質問があります。

getActiveCellを使ってスプレッドシートのカーソルの当たっているセルのRengeを取得する関数(getCellrange())を
scriptで作成しました。
その関数を特定のセルに設定し常にカーソルのあるセルの値を取得するようにさせたいと考えています。
→あるセルに=getCellrange()を設定

しかし、実際に取得できるRangeは関数を設定したセルの値になっているようです。
特定のセルに関数を設定した状態でその関数からカーソルの当たっているセルのRangeを取得する方法はありますでしょうか?

a2c

unread,
Jul 3, 2011, 12:32:37 PM7/3/11
to google-app...@googlegroups.com
こんばんわpochi0220さん

a2cです。

任意のセルに=getCellrange()を記述することによって
アクティブなセルIDを取得し表示させたいという事でしょうか?

Cellのフォーカスが変わったタイミングでトリガーを仕込む
方法が分からないのですが、何がしか編集して良いのであれば
onEdit()を利用するとアクティブセルが取得できます。

サンプルを作ってみました
getCellrange() 関数で、UserPropertiesにcellIDを書きこんで
そのセルに表示させようとしたのですが、うまく動かず
ハードコードになっていますが・・・


function onEdit(){
 vis_cell = "A1";
 var ss = SpreadsheetApp.getActiveSpreadsheet();
 var cur_cell = ss.getActiveCell().getA1Notation();
 ss.getRange(vis_cell).setValue(cur_cell);
}

カーソルのフォーカスを変えた時にイベントが仕込めるか
もう少し探してみます。

a2c

unread,
Jul 3, 2011, 12:46:45 PM7/3/11
to google-app...@googlegroups.com
a2cです。

UserPropertiesに表示させるCellを仕込むバージョンです。
初回設定時にエラーが出ますが、その後他のセルをいじると
設定したセルに、編集のあったセルのA1Notationが表示されます。

function setVisCell(){
  var vis_cell_id = '';
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var cur_cell = ss.getActiveCell().getA1Notation();
  UserProperties.setProperty("activeCell", cur_cell);
}

function onEdit(){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var cur_cell = ss.getActiveCell().getA1Notation();
  vis_cell = UserProperties.getProperty("activeCell");
  ss.getRange(vis_cell).setValue(cur_cell);
}

勘違いしていたら教えてください。



pochi0220

unread,
Jul 4, 2011, 1:53:26 AM7/4/11
to Google Apps API Japan

ac2さん、こんにちは。
回答ありがとうございます。

> 任意のセルに=getCellrange()を記述することによって
> アクティブなセルIDを取得し表示させたいという事でしょうか?

特定の1つのセルにアクティブなセルの情報を常に表示させたいです。
教えて頂いた方法を利用して実現できました。ありがとうございます。

上記はガジェットをその特定のセルに挿入し、常にカーソルが当たっているセルの情報にアクセスさせることを想定しています。
(セルの中身は編集せずに、カーソルを当てるだけ)

セルの選択だけでガジェットの挿入セルの情報を書き換えたいのですが、onEditやUiserviceなどを使わないと、アクティブなセルの情報は取
得できないのでしょうか。
調べた限りではセルのクリックイベントは存在していないようです。
もしくはガジェットをクリックした際にイベントを発生させ、カーソルの当たっている情報を取得させる・・ということはできないものでしょうか?

a2c

unread,
Jul 4, 2011, 11:29:37 AM7/4/11
to google-app...@googlegroups.com
pochi0220さん、こんばんわ

ac2こと a2cです。自分で自分のハンドルtypoしてました、恥ずかしい・・

あのやり方だと変更があった時しか取れないので、ご希望の挙動とちょっと違いますよね。
ガジェットからTriggerを送れるということなのですが、今のところ外からキックする
ベストなやり方を知りません。どこかから、フォームに送ったりリロードかけてonOpenとかを
発動させられればいい気がしますが、その際には、開いたシートのactiveCellを取りに行くので
ユーザーの開いているactiveCellとはずれてしまいますね。

フォーカスを取れるメソッドがあればそれで済むはずなので、リクエストしてみます。



pochi0220

unread,
Jul 4, 2011, 11:49:46 AM7/4/11
to Google Apps API Japan
a2cさん、こんばんわ。

名前を間違えてしまってすみません。。

やりたいことの実現は現状では難しそうだとわかりました。

> フォーカスを取れるメソッドがあればそれで済むはずなので、リクエストしてみます。
よろしくお願いします。

いろいろ検討頂きありがとうございました。

piza

unread,
Jul 22, 2011, 4:53:00 AM7/22/11
to Google Apps API Japan
初めまして。
やり取りを拝見しました。
>ガジェットをクリックした際にイベントを発生させ、カーソルの当たっている情報を取得させる
でもいいそうですが、onOpenでメニュ-バーを作成し、クリックしたときにカーソルの当たっている情報を取得させるではだめでしょうか?
これでもいいのならできると思います。

function onOpen() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var menuEntries = [];
menuEntries.push({name: "Menu Cellrange", functionName:
"getCellrange"});
ss.addMenu("addMenuExample", menuEntries);
}

function getCellrange() {
var vis_cell = "A1";
var ss = SpreadsheetApp.getActiveSpreadsheet();
var cur_cell = ss.getActiveCell().getA1Notation();
ss.getRange(vis_cell).setValue(cur_cell);
}

>セルのクリックイベントは存在していない
ブラウザがchromeなら、図形描画で透明なボタンを作成し"A1"に移動させスクリプトの割り当てで"getCellrange"を割り当てても面
白いと思います。
擬似的に"A1"(実際には透明なボタン)をクリックすると"getCellrange()"が実行されます。

piza

unread,
Jul 26, 2011, 11:37:49 AM7/26/11
to Google Apps API Japan
透明なボタンについての訂正です。
かなり昔chrome以外ではうまく実行できませんでした。念のため7/22にfirefoxで実行したところ、うまく実行できませんでした。そのため
chromeでしか実行できないのかと勘違いしましたが、7/26に実行したところできました。7/22だけ調子が悪かったのかもしれません?少なくと
もchromeとfirefoxでは実行できるようです。
Reply all
Reply to author
Forward
0 new messages