1

これは、 Google Apps Script - possible chart typesの回答に直接関連しています。

アドオンではなく webapp として展開し、URL 引数をアプリ スクリプトに渡すことで、上位の回答を拡張しようとしています。

上記のリンクされた例とまったく同じですが、アドオン コードを削除し、doGet(e)関数を追加して最も基本的な webapp コードを挿入しました。

/*
//if I manually specify the values in the script, it works fine
var sheetRange = "A1:D20"; // standard range to gather data
var sheetTabName = "Sheet1"; //name of the tab in the spreadsheet to look for. must be unique
var spreadsheetId = '1CKQTQYXgt3YgnUXu0YHFeMcG5sMh99sj293oKRFVp4M'; //spreadsheet ID
*/

var sheetRange;
var sheetTabName;
var spreadsheetId;

function doGet(e) {
  //but if I try to load the arguments from the URL, it doesn't work
  //these values never get set here
  sheetRange = e.parameter.sheetRange;
  sheetTabName = e.parameter.sheetTabName;
  spreadsheetId = e.parameter.spreadsheetId;
  Logger.log("This never gets run %s %s %s",sheetRange,sheetTabName,spreadsheetId ); 

  //but this template gets made
  var template = HtmlService.createTemplateFromFile('BubbleEx')
      .evaluate()
      .setSandboxMode(HtmlService.SandboxMode.IFRAME)
      .setWidth(800)
      .setHeight(600);
  Logger.log("Why doesn't this get printed at least?");
  //and returned
  return template;
}

function getSpreadsheetData() {
  Logger.log("This does get run!\nSpreadsheetId is: %s\nSheetRange is: %s\nSheetTabName is: %s",spreadsheetId,sheetRange,sheetTabName);
  var sheet = SpreadsheetApp.openById(spreadsheetId);
  var data = sheet.getSheetByName(sheetTabName).getRange(sheetRange).getValues();
  return (data.length > 1) ? data : null;
}

明らかに、ここでの実行順序について基本的なことが抜けています。HTML がスクリプトと対話する方法に関する何かが、code.gs の特定の部分が完了する前に完了する原因となっています。私はGAS をデプロイされた webapp として使用するの初めてなので、すべてのヘルプが大歓迎です。ありがとう!

これは、私が使用しようとしているフォーマット済みのリンクです(引数が含まれています)。シートは、リンクを使用して公開されています:

https://script.google.com/a/macros/edmonton.ca/s/AKfycbxMbCG3p-zdoJReIS6jRHnLK3J-XsI1Zm_BFvfz_UQ/dev?spreadsheetId=1CKQTQYXgt3YgnUXu0YHFeMcG5sMh99sj293oKRFVp4M&sheetTabName=Sheet1&sheetRange=A1%3AD20
4

1 に答える 1

1

Web アプリでの視覚化

しばらく前のブログ投稿でリンクされた質問を拡張し、ダッシュボードの例を Web アプリとして使用しました。(ダッシュボードのコードはブログにあるので、ここでは繰り返しません。)

ダッシュボードの例

ロガーの使用

コードに残したコメントは、ログが表示されたかどうかに基づいて、何が実行されたかについての結論を示していることを意味します。そんなに簡単だったら!

残念ながら、Logger は、Web アプリやその他の非同期操作のデバッグに使用する場合、信頼性の低いツールです。サプライズ!それは私の別のブログ投稿の主題です。

ロガーは、BetterLog ライブラリといくつかの単純なユーティリティ関数を使用して拡張できるため、非同期のサーバー側呼び出しからだけでなく、クライアント側からもログを生成できます。

これらのグローバルが機能しないのはなぜですか?

実行の順序は問題ではありません。むしろ、グローバル変数が実行インスタンス間でどのように動作するかについてです。

関数に設定spreadsheetIdすると、そのコンテンツはスクリプト全体で使用できますが、そのインスタンスの実行中doGet()のみ使用できます。次の図では、ソリューションのいくつかの部分間の通信を示しています。Google Apps Script 関数への非同期呼び出しごとに、スクリプトの新しい独立した実行インスタンスが作成されます。各インスタンスには、スクリプトのグローバル変数の独自のコピーがあります。

メッセージ シーケンス チャート

この結果、spreadsheetId設定した値は、クライアント側 JavaScript の呼び出しによって呼び出されたときにdoGet()使用できなくなります。変数はシンボルとしてのみ存在します。常に同じコンピューター メモリの一部であるとは限りません。(同じ物理コンピューター上にない場合もあります。)getSpreadsheetData()google.script.run

インスタンス間で生き残るためにいくつかの「グローバル」変数を「設定」したい場合は、Properties Serviceなどの永続的なストレージ方法を使用できます。ただし、あなたの例では、これに注意する必要があります。2 人のユーザーが同時に Web アプリにアクセスしていた場合、最後のユーザーが前のユーザーによって以前に設定された値を上書きします。

これを処理するより適切な方法は、html テンプレートを介して「グローバル」を明示的に渡すことです。(デモの「Web App」テンプレートを使用して新しい Google Apps Script を作成すると、この例が表示されます。)

于 2015-08-20T02:49:32.670 に答える