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

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

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

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

Q&A

解決済

1回答

5924閲覧

IFTTTによる書き込みである場合、onEditは動かないのでしょうか。

koromo_t

総合スコア60

Google Apps Script

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

0グッド

0クリップ

投稿2018/05/19 21:52

編集2018/05/20 16:16

「編集のあったセルのあるシートのシート名」を取得して、
そのシート名が特定のシート名と一致したらスクリプトを動作させる、
という条件を書きたいと思いました。

以前私が投稿したこちらの質問にて、
onEdit(e)を使い、編集のあったセルのあるシートのシート名を取得する方法を教わりました。

上記の記事の質問文では書いていませんが、
「編集」というのが「IFTTTによる書き込み」である場合、onEditは動かないのでしょうか。
書いたスクリプトの動作の様子をしばらく観察していたところ、
どうやら動いていないような気がしました。
プロジェクトの「すべての実行」を確認しても、
おそらくIFTTTからデータが来たと思われるタイミングで、
ステータスが「失敗しました」となっているように思います。
ちなみに、手動でデータをコピペした場合は、「編集した」と認識してくれるようです。

解決策としては、関数名をイベントハンドラではない名前にして、
スクリプトエディタからトリガーを「値の変更時」に設定すればよいのだとは思いますが、
その場合、onEdit(e)のeの部分は定義?できないのでしょうか。
仮に「function zenbu(e)」という名前で、
トリガーを「値の変更時」に設定して試したところ、実行に失敗するようです。
ちなみに、「function onEdit(e)」という名前で、
トリガーを「値の変更時」に設定した場合でも同様でした。

追記(2018/05/20 20:50)

このようなスクリプトとなっております。
トリガーを設定してもしなくても、IFTTTからのデータ取得時にエラーとなります。
パラメータを設定しているところがネックとなっているような気がします。

【2018/05/21 0:55 訂正】
onEdit(e)を使った場合は、IFTTTからデータを取得した際、
実行トランスクリプトにもログにも記録がないように思われます。

javaScript

1function onEdit(e){ 2 var range = e.range; 3 var sheetName = range.getSheet().getName(); 4 Logger.log(sheetName); 5 // 生ログに変更のあったときのみ動かす 6 var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 7 var sheet_nama = spreadsheet.getSheetByName('生ログ'); 8 var lastRow_nama = sheet_nama.getLastRow(); 9 var tweet_nama = sheet_nama.getRange(lastRow_nama,2).getValue(); 10 Logger.log(tweet_nama); 11 if((sheetName=="生ログ")&&(tweet_nama.match(/.*を読んでいる本に追加.*/))){ 12 seikei(); 13 } 14 time(); 15}

追記2(2018/05/21 0:30)

以下のスクリプトで、トリガーを「値の変更時」にすると、期待通りの動作をします。

javaScript

1function zenbu(){ 2 // 生ログに変更のあったときのみ動かす 3 var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 4 var sheet_nama = spreadsheet.getSheetByName('生ログ'); 5 var sheet_henkou = spreadsheet.getActiveSheet().getSheetName(); 6 Logger.log(sheet_henkou); 7 var lastRow_nama = sheet_nama.getLastRow(); 8 var tweet_nama = sheet_nama.getRange(lastRow_nama,2).getValue(); 9 Logger.log(tweet_nama); 10 if((sheet_henkou=="生ログ")&&(tweet_nama.match(/.*を読んでいる本に追加.*/))){ 11 seikei(); 12 } 13 time(); 14}

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

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

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

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

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

coco_bauer

2018/05/20 00:57

どんなスクリプトなのか判らないので、意味不明です。少なくともコードと「ステータスが「失敗しました」となっているように思います」の根拠になるログもしくはスクリーンショットを示してください。
koromo_t

2018/05/20 12:10 編集

どんなスクリプトなのか判らないので意味不明とのこと、申し訳ありません。質問文にてスクリプトを追記しました。これで意味が通じればよいのですが…。エラーについては、おっしゃっている引用部分の区切り位置に問題があるかと思われます。質問文にもすでに書いた通りですが、【「すべての実行」を確認すると、IFTTTのデータが来たと思われるタイミングで、ステータスが「失敗しました」と出ています。】
guest

回答1

0

ベストアンサー

こちらの**Getting started(入門)及びRestrictions(制限事項)**をご確認ください。

「編集」というのが「IFTTTによる書き込み」である場合、onEditは動かないのでしょうか。

onEdit()は手動編集を対象としていますので実行されません。(※1)

解決策としては、関数名をイベントハンドラではない名前にして、

スクリプトエディタからトリガーを「値の変更時」に設定すればよいのだとは思いますが、
その場合、onEdit(e)のeの部分は定義?できないのでしょうか。

上記と同様の理由で解決にはなりません。
もちろん、意図されているようなパラメータの取得も不可です。(※2)

(※1,2)コメントでも触れていますが、ユーザーからの実行が対象となりますので、IFTTTを含む外部連携サービスからの編集は対象外という認識でした。

→ koromo_tさんからの検証報告を受けて
(※1)ユーザー自身による手動実行、という表現のほうが良いかもしれません。
(※2)インストーラブルトリガーとしてなら実行されますが(GAS及びAPIリクエスト以外)、パラメータにより意図した以下の情報を直接取得することは不可が可能です。(当方にて検証済み)

  • authMode
  • changeType
  • source
  • user
  • triggerUid

こちらvaluerangeは取得不可のようです。

当方の認識不足で回答内容が二転三転してしまい、申し訳ございません。
提示コードを修正すると以下となります。

javascipt

1function zenbu(e){ 2 var sheetName = e.source.getSheetName(); 3 /*以下省略*/ 4}

[参考]

投稿2018/05/20 07:57

編集2018/05/21 04:59
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

koromo_t

2018/05/20 12:31 編集

回答ありがとうございます! なるほど、理解しました。 以下は、お話を聞いて思い付き、まだ動作確認ができていないことですが、 では、IFTTTで取得したデータを同スプレッドシート内の別のシートへ importrangeでリンクしたときの書き込み、これでもonEdit(e)は動かないのでしょうか。 おそらく不可なのだとは思いますが…。
koromo_t

2018/05/20 12:25

追記です。 私の記憶違いかと思い、改めて確認しましたが、 やはり、関数名をイベントハンドラではない名前にして、 トリガーを「値の変更時」に設定すると、 IFTTTからのデータの書き込みであっても、スクリプトは動くようです。 パラメータの取得はできないのかもしれませんが…。
退会済みユーザー

退会済みユーザー

2018/05/21 04:33 編集

> IFTTTからのデータの書き込みであっても、スクリプトは動くようです。 厳密には手動実行が対象というより、ユーザーからの実行が対象となりますので、 IFTTT(を含む外部連携サービス)からの操作も対象となるようでしたら、認識を改めないといけませんね。 ただ、スクリプトが動いた(実行された)という根拠を提示して頂けないとなんとも言えません。 (コード中のログ記録でシート名が記録されたとか、スクリプトエディタのメニューより 表示→実行トランスクリプト など) その上で「実行に失敗した」のなら、どの部分で失敗したのか(エラーが出たのか)、が不明です。 エラー内容も提示して頂けますか。 ※coco_bauerさんがご指摘されている点でもあります。 なお、検証方法として、IFTTTからのデータの書き込みがあった場合の処理として、 ごくごく簡単な処理をさせてみてください。 (具体的には提示されているコードの3行目、Logger.log()まで、もしくは単純にLogger.log('OK')など) > importrangeでリンクしたときの書き込み、これでもonEdit(e)は動かないのでしょうか。 おそらく不可なのだとは思いますが…。 んー、質問されるより、まず、ご自身で検証してみましょう。 その結果をご報告いただくほうが、このサイトの趣旨である知識の共有につながります。 もちろん、ご自身の技術と知識レベルの向上にも。 > パラメータの取得はできないのかもしれませんが…。 こちらも同様。 ですが、「動く」のならパラメータは取得できるでしょう。
koromo_t

2018/05/20 16:06 編集

報告します。 どちらも「IFTTTからデータを取得したとき」の記録です。 【質問文の「追記」の状態(onEdit(e)を使った場合。トリガーなし)】 ・実行トランスクリプト 「実行に失敗: TypeError: undefined のメソッド「getSheet」を呼び出せません。(行 3、ファイル「まとめ」)」 ・ログ 「ログが見つかりません。Logger API を使用してプロジェクトにログを追加してください。」 とのことです。 --- 【2018/05/21 0:55 訂正】 上記はただ過去の動作情報が残っていただけで、 onEdit(e)を使った場合は、IFTTTからデータを取得した際、 実行トランスクリプトにもログにも記録がないように思われます。 【質問文の「追記2」の状態(関数名をzenbu()として、トリガーを値の変更時にした場合)】 ・実行トランスクリプト 「実行が無事終了しました」エラーなし。 ・ログ 3行目のLogger.logでは「生ログ」が取得され、スクリプトが実行された。 私の思い付き部分については、まだ検証していません。 --- 【2018/05/21 1:00 追記】 ひとつシートを噛ませたらなにか変わるかと思いましたが、 そういうことはないようです。
退会済みユーザー

退会済みユーザー

2018/05/21 04:34 編集

> 【質問文の「追記」の状態(onEdit(e)を使った場合。トリガーなし)】 上記はただ過去の動作情報が残っていただけで、 実行日時とログの記録日時が明らかに異なるということですね。 だとしたら実行されないのは想定通りですね。 ただし、理由としてはユーザー自身の処理ではないから、ということでしょうね。 > 【質問文の「追記2」の状態(関数名をzenbu()として、トリガーを値の変更時にした場合)】 3行目のLogger.logでは「生ログ」が取得され、スクリプトが実行された。 5行目ですね。了解しました。 端から自動実行は対象外という認識でしたので、未検証のままでした。 編集権限のあるユーザーからの処理、というGAS側の認識なのでしょうね。 > IFTTTからのデータの書き込みであっても、スクリプトは動くようです。 パラメータの取得はできないのかもしれませんが…。 気になったので検証しました。 パラメータ、取得できます。
koromo_t

2018/05/21 17:08

回答ありがとうございます! いただいた通りにスクリプトを修正したところ、期待通りの結果を得ることができました! 検証もしていただいたようで、ありがとうございます! いろいろと勉強になりました。 ところが、パラメータを利用したことが原因なのかわからないのですが、 もともと1秒かそこらで完了していたはずのこのスクリプトが、 なぜか完了までに90秒ぐらいかかるようになってしまいました。 これは新たな問題だと思うので、新しく質問記事を投稿しました。 もしよければ、そちらも見ていただけるとありがたいです。 こちら→https://teratail.com/questions/127276 あと…、 > 5行目ですね。 そうでしたね…(笑)、誤記でした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問