質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

解決済

1回答

5928閲覧

GASにて。onOpen ⇒ 実行ボタン押す ⇒ 許可 ⇒ function実行されない

退会済みユーザー

退会済みユーザー

総合スコア0

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

0グッド

1クリップ

投稿2019/01/16 14:53

編集2019/01/18 16:22

前提・実現したいこと

googleスプレッドシートで連絡先を更新するスクリプトを作りました。

(理想の流れ)
①スプレッドシートを開く

②onOpenで「連絡先を更新」ボタンを表示

③「連絡先を更新」ボタンをクリック

④「このドキュメントに添付されたスクリプトを実行するには、あなたの許可が必要です。」
が表示される

⑤許可する

⑥連絡先を更新するfunctionが実行される

~以上~

なのですが、現状、⑤の許可を終えても⑥のfunctionが実行されず、困っています。
少し前までは問題なく使えていたのですが…。

ちなみに再度③の「連絡先を更新」ボタンをクリックすると、
⑥のfunctionが実行されはじめます。

問題を端的に言うと(papinianusさんより)

質問はつきつめると、「最初の承認直後には、スクリプトが動作してくれないがそれはなぜか?」

まさにこれです。

一度のクリックで実行する対処法をご存知の方、ご教示いただけないでしょうか。

エラーメッセージ

エラーメッセージは特に何も出ません。

該当のソースコード

/** シートに書き込んだ名簿からコンタクトを作成 */ function makeContactFromList(){ SpreadsheetApp.getActiveSpreadsheet().toast('処理中', '', -1); // 連絡先の削除 **さん var contact = ContactsApp.getContact('***@email.com'); if (contact == null) {//メールアドレスが無かったら無視して次すすむ } else { contact.deleteContact(); Logger.log("連絡先が削除されました"); }; var groupList = {}; // シートの情報を得る var sheet = SpreadsheetApp.getActiveSheet(); var rows = sheet.getDataRange(); var numRows = rows.getNumRows(); var values = rows.getValues(); // 各列をそれぞれ確認する for (var i = 0; i <= numRows - 1; i++) { if (i == 0) continue; // 一行目はヘッダ var row = values[i]; // フィールドを得る var fname = row[0]; var gname = row[1]; var email = row[2]; var group = row[3]; // フィールドの確認 if (fname == "") continue; // 空白行 if (email == "") { Browser.msgBox(fname + gname + "にメールアドレスがありません。"); continue; } // 既にそのコンタクトが登録されているか調べる var con = ContactsApp.getContact(email); if (con == null) { // 登録されてなければ新規作成 con = ContactsApp.createContact(gname, fname, email); Logger.log(fname+gname+"を追加しました"); } // グループが登録されているか調べる var grp = groupList[group]; if (grp == null) { var grp = ContactsApp.getContactGroup(group); if (grp == null) { // グループがなければ作成 grp = ContactsApp.createContactGroup(group); Logger.log(group+"を作成しました"); } groupList[group] = grp; } // グループにコンタクトを追加 grp.addContact(con); Logger.log(email + "を" + group + "に追加"); } SpreadsheetApp.getActiveSpreadsheet().toast('画面を閉じてください', '完了', -1); }; /** メニューへ登録 */ function onOpen() { var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); var entries = [{ name : "連絡先を更新", functionName : "makeContactFromList" }]; spreadsheet.addMenu("ここをクリックしてください", entries); };

試したこと:SSO(SAML2.0)が関係しているか検証

当方Gsuiteユーザで、出来なくなったタイミングが、GsuiteにSSOを入れたタイミングと一致しているような気がします。

⇒ GsuiteでSSOを入れていないユーザさんに事象再現をしていただきました。
結果、当方と同じく、承認した直後にはスクリプトは走らず、二回目に実行したらグループに入りました。

ので、SSOの関連は低いことが推察されます。

試したこと2:addMenuメソッド⇒addItemメソッドに変更

(変更前)

/** メニューへ登録 */ function onOpen() { var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); var entries = [{ name : "連絡先を更新", functionName : "makeContactFromList" }]; spreadsheet.addMenu("ここをクリックしてください", entries); };

(変更後)

/** メニューへ登録 */ function onOpen() { var ui = SpreadsheetApp.getUi(); // Uiクラスを取得する var menu = ui.createMenu('ここをクリックしてください'); // Uiクラスからメニューを作成する menu.addItem('連絡先を更新', 'makeContactFromList'); // メニューにアイテムを追加する menu.addToUi(); // メニューをUiクラスに追加する };

に変更して再度実行しましたが、改善は見られませんでした。

試したこと3:onOpenを削除して、トリガーを設定

onOpen⇒addMenuを起動するスクリプトをまるっと削除して、
トリガーを設定しました。
(実行する関数/makeContactFromList」「イベントソース/スプレッドシート・起動時」で設定)

結果、「このドキュメントに添付されたスクリプトを実行するには、あなたの許可が必要です。」が表示されなくなり、前に進みませんでした。

やはり、onOpenで「実行」をクリックしなければ、「このドキュメントに添付されたスクリプトを実行するには、あなたの許可が必要です。」が表示されないようです。

試したこと4:別のスクリプトで試しても実現できない

回答者さんに試していただきました。

普通に(onOpenではない)動かす関数をスクリプトエディタで書いた上で、エディタ画面で実行。
同じように、承認を求められ、同じように動作しなかった。
少なくとも数ヶ月前までは、その場で最初の実行が走っていた。どうも承認した瞬間の最初の関数呼び出しの動き自体がかわってる気がする……

ちなみにGsuite外の個人用のアカウントでも試していただきましたが、
違った動きはみられませんでした。

これはもうgoogleの機能の問題なのか?

という感じがしていますが…。なぜなのでしょうか…。

補足情報

  • 当方Gsuiteユーザです

  • 一度実行すればキレイに更新されるので、スクリプトの記述に問題があるわけではなさそうです。

  • 当初(2018年9月、10月頃)はうまくいっていたのですが、11月頃からできなくなりました。

  • できなくなったタイミングがGsuiteにSSO(SAML2.0)を導入したあたりと一致しているように思います。

⇒ GsuiteでSSO導入無しのユーザさんに検証いただく。結果、同様の事象が発生したので関係なさそう。

実行トランススクリプトの結果

ご依頼ありがとうございます。下記にて記載いたしますが要約は

・1回目の実行:何も結果表示されない
・2回目の実行:onOpenをすっとばして、fanction実行されている
です。

**(実行前)※作成時に試したログだと思われます** [19-01-16 17:20:08:132 PST] SpreadsheetApp.getActiveRange() [0 秒] [19-01-16 17:20:08:132 PST] Range.getRow() [0 秒] [19-01-16 17:20:08:132 PST] Range.getLastRow() [0 秒] [19-01-16 17:20:08:132 PST] Range.getColumn() [0 秒] [19-01-16 17:20:08:133 PST] Range.getLastColumn() [0 秒] [19-01-16 17:20:08:133 PST] SpreadsheetApp.getActiveSpreadsheet() [0 秒] [19-01-16 17:20:08:134 PST] 実行を開始しています [19-01-16 17:20:08:139 PST] SpreadsheetApp.getActiveSpreadsheet() [0 秒] [19-01-16 17:20:08:228 PST] Spreadsheet.addMenu([ここをクリックしてください, [{functionName=makeContactFromList, name=連絡先を更新}]]) [0.087 秒] [19-01-16 17:20:08:357 PST] 実行が無事終了しました(合計ランタイム 0.089 秒) **(一回目の実行後)※変化ありませんでした** [19-01-16 17:20:08:132 PST] SpreadsheetApp.getActiveRange() [0 秒] [19-01-16 17:20:08:132 PST] Range.getRow() [0 秒] [19-01-16 17:20:08:132 PST] Range.getLastRow() [0 秒] [19-01-16 17:20:08:132 PST] Range.getColumn() [0 秒] [19-01-16 17:20:08:133 PST] Range.getLastColumn() [0 秒] [19-01-16 17:20:08:133 PST] SpreadsheetApp.getActiveSpreadsheet() [0 秒] [19-01-16 17:20:08:134 PST] 実行を開始しています [19-01-16 17:20:08:139 PST] SpreadsheetApp.getActiveSpreadsheet() [0 秒] [19-01-16 17:20:08:228 PST] Spreadsheet.addMenu([ここをクリックしてください, [{functionName=makeContactFromList, name=連絡先を更新}]]) [0.087 秒] [19-01-16 17:20:08:357 PST] 実行が無事終了しました(合計ランタイム 0.089 秒) **(2回目の実行後)※functionのみ実行されます** [19-01-16 17:22:11:077 PST] 実行を開始しています [19-01-16 17:22:11:086 PST] SpreadsheetApp.getActiveSpreadsheet() [0 秒] [19-01-16 17:22:11:163 PST] Spreadsheet.toast([処理中, , -1.0]) [0.076 秒] [19-01-16 17:22:11:535 PST] ContactsApp.getContact([//@email.com]) [0.37 秒] [19-01-16 17:22:14:403 PST] ContactsApp.getContact([//@email.com]) [2.867 秒] [19-01-16 17:22:17:038 PST] ContactsApp.getContact([//@email.com]) [2.635 秒] [19-01-16 17:22:19:945 PST] ContactsApp.getContact([//@email.com]) [2.906 秒] [19-01-16 17:22:22:782 PST] ContactsApp.getContact([//@email.com]) [2.836 秒] [19-01-16 17:22:25:156 PST] ContactsApp.getContact([//@email.com]) [2.373 秒] [19-01-16 17:22:28:088 PST] ContactsApp.getContact([//@email.com]) [2.931 秒] [19-01-16 17:22:30:968 PST] ContactsApp.getContact([//@email.com]) [2.88 秒] [19-01-16 17:22:33:801 PST] ContactsApp.getContact([//@email.com]) [2.83 秒] [19-01-16 17:22:36:555 PST] ContactsApp.getContact([//@email.com]) [2.753 秒] [19-01-16 17:22:36:556 PST] SpreadsheetApp.getActiveSheet() [0 秒] [19-01-16 17:22:36:866 PST] Sheet.getDataRange() [0.309 秒] [19-01-16 17:22:36:866 PST] Range.getNumRows() [0 秒] [19-01-16 17:22:36:941 PST] Range.getValues() [0.074 秒] [19-01-16 17:22:39:606 PST] ContactsApp.getContact([//@email.com]) [2.664 秒] [19-01-16 17:22:39:687 PST] ContactsApp.getContactGroup([●●●]) [0.081 秒] [19-01-16 17:22:39:688 PST] Contact.addToGroup([ContactGroup]) [0 秒] [19-01-16 17:22:39:688 PST] ContactGroup.addContact([Contact]) [0 秒] [19-01-16 17:22:39:689 PST] Logger.log(//@email.comを●●●に追加, []]) [0 秒] [19-01-16 17:22:42:534 PST] ContactsApp.getContact([//@email.com]) [2.844 秒] [19-01-16 17:22:42:613 PST] ContactsApp.getContactGroup([▼▼▼]) [0.078 秒] [19-01-16 17:22:42:613 PST] Contact.addToGroup([ContactGroup]) [0 秒] [19-01-16 17:22:42:614 PST] ContactGroup.addContact([Contact]) [0 秒] [19-01-16 17:22:42:614 PST] Logger.log([//@email.comを▼▼▼に追加, []]) [0 秒] [19-01-16 17:22:45:512 PST] ContactsApp.getContact([//@email.com]) [2.897 秒] [19-01-16 17:22:45:512 PST] Contact.addToGroup([ContactGroup]) [0 秒] [19-01-16 17:22:45:513 PST] ContactGroup.addContact([Contact]) [0 秒] [19-01-16 17:22:45:513 PST] Logger.log([//@email.comを▼▼▼に追加, []]) [0 秒] [19-01-16 17:22:45:514 PST] SpreadsheetApp.getActiveSpreadsheet() [0 秒] [19-01-16 17:22:45:584 PST] Spreadsheet.toast([画面を閉じてください, 完了, -1.0]) [0.07 秒] [19-01-16 17:22:45:651 PST] 実行が無事終了しました(合計ランタイム 34.5 秒)

連絡先はきれいに更新されました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

papinianus

2019/01/16 23:53

実行後に、スクリプトエディタのログなどが見れるメニューから、実行トランスクリプトを取得して質問に追記してください。
退会済みユーザー

退会済みユーザー

2019/01/17 01:44

ありがとうございます。追記いたしましたので、どうぞよろしくお願いいたします。
papinianus

2019/01/17 02:09

これって毎回開くたびに「承認」が求められるってことですかね?上手くうごいていたときもそうでしたか?
退会済みユーザー

退会済みユーザー

2019/01/17 02:22 編集

ありがとうございます。 >これって毎回開くたびに「承認」が求められるってことですかね? いや、ここは補足させてください。いつもは1回の承認だけです。 本来なら、一度承認すると、googleアカウントの設定にある「アカウントにアクセスできるサードパーティ アプリ」の中にスクリプト名が登録され、一度登録されれば、再度求められることはありません。 が、今回は事象再現のために、一度登録された「アカウントにアクセスできるサードパーティ アプリ」からスクリプトを削除したので、もう一回「承認」を求められました。 何卒…よろしく…お願い申し上げます
papinianus

2019/01/17 02:25 編集

毎回承認が求められないはずだと期待しての質問なので、それなら納得です。 質問はつきつめると、「最初の承認直後には、スクリプトが動作してくれないがそれはなぜか?」であって、承認後同じユーザが(開き直したブラウザで)メニューをクリックすれば正常に動作する、ということでよろしいですか? 一応SSOなしの、Gsuiteユーザなので時間があるときに再現検証はさせていただくつもりでおります。
退会済みユーザー

退会済みユーザー

2019/01/17 02:25

そうでございます!!! 何卒…何卒…よろしくお願いいたします…!!
退会済みユーザー

退会済みユーザー

2019/01/17 02:42

>一応SSOなしの、Gsuiteユーザなので時間があるときに再現検証はさせていただくつもりでおります。 神…。
papinianus

2019/01/17 04:48

神ではなかったです…。提示のコードで、スプレッドシートに「姓、名、アドレス、グループ名」を2行ほど書いて実行しましたが、おっしゃるとおり承認した直後にはスクリプトは走らず、二回目に実行したらグループに入りました。 可能性は低いと思うのですが、仕様がかわったんでしょうかね?
退会済みユーザー

退会済みユーザー

2019/01/17 05:11

神様仏様pap様 もうやっていただいたんですね、ありがとうございます!! >承認した直後にはスクリプトは走らず、二回目に実行したらグループに入りました。 なんと…!そうか…SSOは関係ないんだ。それが分かったのは収穫です。 ありがとうございます。 仕様が変わった可能性は、信じたくはないですね…。 addMenuメソッドが悪いのか…? addItemなるものもあるみたいなので、一度そちらでチャレンジしてみます。 また報告させていただきます。
papinianus

2019/01/17 05:15

addItemは`entries`のように事前に配列を用意してなかったときに後から追加するやつです(事前に用意してても追加できますが)。
papinianus

2019/01/17 05:30

ちなみに、うまく動いてたのって結構前ですか?もしくはトリガー設定してませんでした?
退会済みユーザー

退会済みユーザー

2019/01/17 05:50

>ちなみに、うまく動いてたのって結構前ですか? うまくいってたのは、2018年9月、10月頃です。 このスクリプトは、月1回、社内ユーザにアドレス帳更新してねと送っているファイルで、2018年の8月頃に制作しました。 11月からアドレス帳の更新が全くできていませぬ… >もしくはトリガー設定してませんでした? トリガー設定はスクリプトの制作段階(2018年8月頃)で一度設定してやってみましたが、 (確か「実行する関数/makeContactFromList」「イベントソース/スプレッドシート・起動時」で設定) トリガーだけだと、「このドキュメントに添付されたスクリプトを実行するには、あなたの許可が必要です。」が表示されず、やむなくonOpenでクリックするひと手間を入れた記憶があります。 …が、もう一度やってみます。
退会済みユーザー

退会済みユーザー

2019/01/17 05:53

>addItemは`entries`のように事前に配列を用意してなかったときに後から追加するやつです(事前に用意してても追加できますが)。 ありがとうございます。頭を使わず猪突猛進でとりあえずやってみましたが、 状況は何も変わりませんでした。
退会済みユーザー

退会済みユーザー

2019/01/17 08:41

>…が、もう一度やってみます。 試しましたがやはり申し上げた通りの事象がおきました。 「このドキュメントに添付されたスクリプトを実行するには、あなたの許可が必要です。」が表示されません。
papinianus

2019/01/17 08:43

それは、トリガを設定したのとは別のユーザで、ってことですよね。何なんでしょうねー10月くらいから仕様はかわってないと思うー
papinianus

2019/01/17 09:12 編集

ちょっと別の観点でテストしました。 普通に(onOpenとかじゃなくて)動かす関数をスクリプトエディタで書きました。で、それをエディタ画面で実行したんです。同じように、承認を求められます。で、同じように、動作しなかったです。少なくとも数ヶ月前までは、その場で最初の実行が走っていたので、どうも承認した瞬間の最初の関数呼び出しの動き自体がかわってる気がするんですが…… ちょっとまって。個人用の(Gsuiteじゃない)GoogleSheetだと承認後すぐ動きますね。謎
退会済みユーザー

退会済みユーザー

2019/01/17 09:21

ええええええ… え? ええ? え、これ、バグか? バグにしても、もう数ヶ月たってて、放置ってのもおかしいですよね… うおおお、関数呼び出しの動きなんてこっちで変えようもないしな… えーー
papinianus

2019/01/17 09:30

個人の(Gsuiteじゃないやつでも)メニューからだと承認後すぐは動かんかった…なんなんや、謎
退会済みユーザー

退会済みユーザー

2019/01/18 04:20

http://hokoxjouhou.blog105.fc2.com/blog-entry-257.html このリンク先にある、参考にしたアドレス更新のファイルが公開されているんですが、 先ほど再度試してみました。 これだと承認後、functionを走らせようとしていた感じがします。 (途中でエラーになって止まっちゃいますが)
退会済みユーザー

退会済みユーザー

2019/01/18 04:32

>これだと承認後、functionを走らせようとしていた感じがします。 すいません、再度落ち着いてやってみるとやっぱり駄目でした。
papinianus

2019/01/18 04:37

Gsuiteも個人も、グループの更新/登録のいずれを最初に押しても、msgboxがたちあがらないです(トランスクリプトを見ても実行した形跡なし)。認証後に二度目のクリックでは正常に(エラーなく)動作しました。 あと、このかたの説明では、onOpenで承認が走るっぽく書いてますが、実際onOpenによるメニュー作成は承認なく実行でき、ボタンを押してはじめて認証、の流れでした。こちらとそちらで違うってことはGoogleの設定なんですかね。
papinianus

2019/01/18 04:42

落ちついた部分読んでなかったっす。でも、この説明サイトの「そうすると、「グループの再読込」を促されるので」とかを読むと、そのまま実行されてたんだろうなと思わせます
macaron_xxx

2019/01/23 08:50

これ、やってみましたけど、私の環境ではfunctionまでしっかり実行されましたよ。
退会済みユーザー

退会済みユーザー

2019/01/23 12:37

macaron様 ご確認&投稿ありがとうございます。ぜひ詳しいお話を伺いたいのですが、 macaron様の環境は ・googleアカウントの種類はGsuite(法人版)でしょうか。それとも個人版でしょうか。 ・利用したブラウザはchromeでしょうか。IEでしょうか。 ・実行していただいたfunctionは、私が最初に投稿した「ソースコード」でしょうか。  それとも、http://hokoxjouhou.blog105.fc2.com/blog-entry-257.html でしょうか。 どうぞよろしくお願いいたします。
macaron_xxx

2019/01/23 14:12

GSuiteでChrome最新版ですね。実行したスクリプトはこちらに記載いただいているものです。
guest

回答1

0

ベストアンサー

2019/2/28 再度挑戦してみたところ、問題なく実行されました。何だったのだろう…

投稿2019/02/28 07:47

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

papinianus

2019/02/28 08:27

まぢですか。後でやってみます。何だったのだろう…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問