前提・実現したいこと
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 秒)
連絡先はきれいに更新されました。













回答1件
あなたの回答
tips
プレビュー