0

getActiveRange()、getActiveSelection()などの関数は、スクリプトがスプレッドシートまたはコンテナ拡張でカスタム関数として実行される場合にのみ機能することがわかりました(スクリプトの実行メソッドを参照)。私の観察は正しいですか?スクリプトをWebアプリとして展開し、SpreadsheetApp.openById()を使用してスプレッドシートを開き、スプレッドシートの所有者がドライブで開いていると仮定して、アクティブな範囲/選択を取得する方法はありますか?

問題は、Googleスプレッドシートの拡張機能を作成していることですが、カスタムUIを構築するために、HtmlサービスUIサービスは使用せず、従来のプレーンHTML/JSが必要です。そこで、UIをページにレンダリングし、iframeでスプレッドシートを開いてから、UIがGoogle Scriptsをサービスとして呼び出します。つまり、スクリプトをWeb Apps(さまざまなスプレッドシートタスクを自動化する)としてデプロイし、URLパラメーターを使用して呼び出します。アプリケーションのディールブレーカーであるアクティブな範囲/選択を取得できないことを除いて、正常に動作します。

4

1 に答える 1

3

残念ながら、あなたの観察は正しいので、あなたはできません。

onEdit()ただし、メイン スプレッドシートで 2 番目のシートを使用し、メイン シートのアクティブ セルを監視するトリガーを使用する場合は、回避策が考えられます。次に、外部 webApp は、この 2 番目のシートの値を非常に簡単にポーリングできます。

スプレッドシートの(単純な)コードは次のとおりです。

function onEdit(event){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sh = event.source.getActiveSheet();
  var r = event.source.getActiveRange();
 // if(sh.getName()!='main sheet'){return};
  ss.toast('hi = '+r.getA1Notation()+'/'+sh.getName()+'   value='+r.getValue());
  var tracker = ss.getSheetByName('tracker sheet');
  tracker.getRange(tracker.getLastRow()+1,1).setValue(r.getA1Notation());
  Browser.msgBox('new')
}

そして、次のような結果を表示する単純な webApp :

function doGet(){
  var targetId = '0AnqSFd3iikE3dFRqUFVMSjdiSU9EV1pGcG1hQ3FlT1E'
  var sh = SpreadsheetApp.openById(targetId).getSheetByName('tracker sheet');
  var cell = sh.getRange(sh.getLastRow(),1).getValue();
  var html ="<!DOCTYPE html><body>Active Cell in your sheet is "+cell+"</body></html>";
  return HtmlService.createHtmlOutput(html).setTitle('onEdit result')
}

テストシートはこちら(書き込み可能な「メインシート」とA1表記を保持する「トラッカーシート」)とそれに付随するwebappはこちら

テスト目的でのみ onEdit 関数を監視する「トースト」を追加しました

于 2013-01-03T18:43:49.737 に答える