web-dev-qa-db-ja.com

シートを共有している他のユーザーがGoogleApps Scriptを実行するにはどうすればよいですか?

うまく機能するGoogleAppsScriptがあります。シートを共有しようとしている他の人は、次のメッセージを受け取ります。

そのアクションを実行するためのアクセス権がありません。このアイテムの所有者にアクセスを許可するように依頼してください。

スクリプトは、既存のシートを新しいデータ行で更新するために使用されます。 UIに追加されたメニュー項目を使用してトリガーされ、次のことを行います。

  • GDriveフォルダーで.xlsxファイルを検索します(このファイルはWebサービスによってエクスポートされ、手動でGDriveフォルダーに配置されます。ファイルの内容や形式を制御することはできません)
  • UrlFetchApp(uploadType = media&convert = true)を使用して、ファイルを.xlsxから.gsheetに変換します
  • UrlFetchAppを使用して、結果の.gsheetのファイル名とフォルダーの場所を変更します。フォルダーの場所が.xlsxファイルの場所と一致するようになりました(UrlFetchAppを使用してファイルを変換すると、結果のファイルはGDriveのルートに配置されているように見えます)
  • DriveAppを使用して.gsheetを取得し、スクリプトでアクセスできるように開きます
  • 行の各要素のキーとして列ヘッダーを使用して、.gsheetのすべてのデータを2次元配列に格納します
  • 宛先シートからの既存データのすべてのID値(一意)を1d配列に格納します
  • 2つの配列を比較し、1d配列の1つと一致するIDを含む行を2d配列から削除し、2d配列に新しいデータのみを残します
  • 2d配列の各行をループし、次に宛先シートの各列をループして、列ヘッダーの値をキーとして使用して、2d配列の行から宛先シートのデータの下部にある新しい行にデータを追加します。各要素

コードは問題なく機能するので問題はないので、アクセス許可に問題があるはずですが、その方法がわかりません。シートは彼らと共有され、ファイルが保存されているGDriveフォルダは彼らと共有されます。自分で最初にスクリプトを実行したとき、GDriveフォルダーにアクセスするためのスクリプトのアクセス許可を付与する必要がありました。これは明らかに現在行われています。

私は私たちのグループの開発者であり、データのユーザーではありませんが、ユーザーが自分で行うのではなく、必要なときに毎回スクリプトを実行してデータを更新する必要があります。迷惑です。

問題がここでどこにあるのかを理解しようとする助けは大歓迎です。

EDIT:これをもう一度読んでみると、ファイルが変換されるときに、最初はGDriveルートに保存されていることがわかりました。そのため、フォルダを変更する必要があります。ルートであるため、このファイルのユーザーとは共有されません。これが理由でしょうか?もしそうなら、どうすればこれを回避できますか?変換時に、結果のファイルを保存するフォルダーを指定できますか?

9
Baddie

これを修正するには、スクリプトをWebアプリとしてデプロイする必要があります(アイデアは@MarioRの回答から得られますが、設定は異なります)。

  • 所有者アカウントでシートを開き、スクリプトエディタを開きます
  • Publishをクリックしてから、Deploy as web appをクリックします。
  • Execute the app asの場合はUser accessing the web appを選択し、Who has access to the appの場合はAnyoneを選択します

ユーザーが初めてスクリプトを使用するときは、スクリプトを許可する必要があります(This app isn't verifiedを取得した場合は、下部にあるAdvancedをクリックしてから、Go to <script name> (unsafe)をクリックする必要があります) )。この後、スクリプトを実行できるようにシートを更新する必要がある場合があります。

所有者がシートを新しいユーザーと共有する場合、スクリプトがWebアプリとして展開された後、新しいユーザーはスクリプトの承認を許可されるまで15分(またはそれ以上)待つ必要があります(その間、このユーザーは引き続き取得します赤い警告)。

所有者のみがWebアプリとしてデプロイでき、それを実行しようとする他のユーザーはメッセージエラーを受け取りません。ポップアップFetching Dataが永久にスタックしたままになります!)所有者を変更するには:シートを開きます。所有者アカウントで、Share> Advancedをクリックします>「所有者になる」の横にあるドロップダウンをトリガーする矢印をクリックします> Set as owner

3
MagTun

私の経験では、スプレッドシートを開くたびにユーザーのGSuiteライセンス情報を取得するスプレッドシートを作成しました。私が行ったのは、スーパー管理者でスクリプトを作成したことですが、スプレッドシートが共有されている場合、[AppsScript]メニューから[Publish]> [Deploy as Webb App]に移動するまで、他のユーザーは同じ問題を抱えていました。この画像のようなオプションを残します

enter image description here

それは私のために働いた、私はそれがあなたのために働くことを願っています。この更新後、スプレッドシートの編集権限を持つすべてのユーザーは、スプレッドシートが開くたびに、スーパー管理者に代わって情報を取得できるようになりました。スクリプトまたはスプレッドシートを使用するthe userとしてではなく、youとしてアプリを実行するようにしてください。

通常、他のユーザーは管理者権限を必要とするスクリプトを実行できませんが、これで問題は解決します。これがうまくいったかどうか教えてください!

ご挨拶。

2
Mario R.

スクリプトをWebアプリとして試した後、「doGet」を取得しました。 「doGet」とはどういう意味ですか?

@MagTunと@browlyのソリューションを確認してファイルを共有し、15分間待ちます。プログラムでファイルの編集権限を付与した場合でも、先週この問題に直面しました。一部のユーザーは許可を与える画面を取得しますが(正しい)、一部のユーザーは「許可が必要です」というメッセージまたは「申し訳ありませんが、現時点ではファイルを開くことができません」(間違っています)のいずれかを受け取るため、注意が必要です。しかし、しばらくすると、ユーザーはファイルへのアクセスを明示的に要求するかどうかに関係なく、スクリプトを実行できるようになりました。したがって、他に必要なものは何もありませんが、約15分待つと、一貫して許可を求められます。ヒントをありがとう、それは私の問題の解決策を確認しました。

0
TomR