1

私は自分の会社のために簡単なアドオンを作成しました。アドオンは呼び出されると現在のシートを見て、すべてのセルを指定された用語集の対応する値に置き換えます。Google Appsシートのアドオンで外部シートを読み込み

など、「321_name」で「名前」を置き換えます

これを行うために、私は地元を使用たとえば、値「ブランド」ですべてのセルを見つけるだろう、と「123_brand」に置き換えます(「第2列は「123_brand」、「321_name」などがあり、第1列には「Brand」、「Name」などがあります)。私の会社のすべてのメンバーは、そのシートに対して読者の承認を得ています。

私は、次の方法でそれをロードします。

function onOpen() { 
    SpreadsheetApp.getUi().createAddonMenu() 
     .addItem('Parse sheet', 'parseSheet') 
     .addToUi(); 
} 

function onInstall(){ 
onOpen(); 
} 

var librarySpreadsheet = SpreadsheetApp.openById("ID to my Glossary Sheet"); 

function parseSheet(){ 
    /* Does the sheet parsing */ 
} 

問題がある:それは動作しません。

インストール直後に、「Parse Sheet」ボタンが正常に表示され、すべて正常に機能します。しかし、ユーザーが別のシートに行くと、アドオンはそこで動作しません。コンソールを確認すると、次のメッセージが表示されます。

Google Appsスクリプト:この操作を実行する権限がありません。

ユーザーが他のシートのアドオンを削除して再インストールすると、正常に動作します。

代わりに編集権限を与えようとしましたが、それでも機能しません。これはすべてのユーザーに適用されます。

アドオンが外部スプレッドシートへのアクセスを拒否されているのはなぜですか?

var librarySpreadsheet = SpreadsheetApp.openById("ID to my Glossary Sheet"); 

これはあなたの関数内で宣言されていない、すなわちグローバルdelcarationです:

+1

私はそれが "認証モード"と関係があると推測しています。引用:***アドオンがストアからインストールされると、そのonInstall(e)関数はAuthMode.FULLで実行されます。***アドオンがインストールされた後、AuthModeが変更されることがあります。 [Add-on Authorization Lifecycleへのリンク](https://developers.google.com/apps-script/add-ons/lifecycle)を読んだことがあります –

+0

アドオンが機能しないと言うときは、アドオンメニューのこの特定のアドオンを参照してください? –

+0

@JackBrown私はアドオンメニューにアドオンが表示されていることを意味しますが、その機能はありません。ちょうど "ヘルプ" –

答えて

1

このグローバル宣言は、あなたのアドオンであなたのアドオンのメニュー機能が表示されない彼の理由です。したがって、新しい文書を開くときにonOpen()関数が呼び出されたときには、それが実行されます。これはドキュメントページからの引用です

警告:onOpen(e)関数を実行すると、スクリプト全体がロードされ、グローバルステートメントが実行されます。これらのステートメントは、onOpen(e)と同じ認証モードで実行され、モードがそれらを禁止すると失敗します。これにより、onOpen(e)が実行されなくなります。公開されたアドオンでメニュー項目を追加できない場合は、ブラウザのJavaScriptコンソールでエラーがスローされたかどうかを確認し、スクリプトを調べてonOpen(e)関数またはグローバル変数が許可されていないサービスを呼び出すかどうかを確認しますAuthMode.NONEにあります。

アドオンがインストールされていて、新しいスプレッドシートで有効になっていないため、authMode.None認可で実行されます。その認証モードでは、スプレッドシートを開く権限がありません。したがって、グローバル宣言は失敗し、メニュー項目を追加しなくてもonOpenは途中で終了します。それを修正するために

私の提案は、ちょうどあなたのparseSheet関数に

function parseSheet(){ 
var librarySpreadsheet = SpreadsheetApp.openById("ID to my Glossary Sheet"); 
    /* Does the sheet parsing */ 
} 

を宣言全体を移動したり、librarySpreadsheetはグローバル変数になりたい場合は、これをやって試すことができます以下の通りです:

var librarySpreadsheet 
function parseSheet(){ 
    librarySpreadsheet = SpreadsheetApp.openById("ID to my Glossary Sheet"); 
     /* Does the sheet parsing */ 
    } 

最後に、これはなぜ再インストール時に機能しますか? (コメントの@SandyGoodによって既に回答されています!)アドオンは、インストールする際にユーザの操作が必要なため、authoMode.FULLで動作します。

したがってAuthMode.FULLのドキュメントからの引用は

アドオンがストアからインストールされている

、そのonInstall(E)関数は 実行、それはグローバルなことを取得することができ、再インストールされますそのドキュメントのアドオンも有効にします。したがって、アドオンは、将来の実行にもそのドキュメントのために正常に動作します

+0

それは、ありがとう! –

関連する問題