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

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

ただいまの
回答率

90.34%

  • Google Apps Script

    947questions

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

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 555

koromo_t

score 50

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

以前私が投稿したこちらの質問にて、
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からデータを取得した際、
実行トランスクリプトにもログにも記録がないように思われます。

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

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

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

function zenbu(){
  // 生ログに変更のあったときのみ動かす
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet_nama = spreadsheet.getSheetByName('生ログ');
  var sheet_henkou = spreadsheet.getActiveSheet().getSheetName();
  Logger.log(sheet_henkou);
  var lastRow_nama = sheet_nama.getLastRow();
  var tweet_nama = sheet_nama.getRange(lastRow_nama,2).getValue();
  Logger.log(tweet_nama);
  if((sheet_henkou=="生ログ")&&(tweet_nama.match(/.*を読んでいる本に追加.*/))){
  seikei();
  }
  time();
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • coco_bauer

    2018/05/20 09:57

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

    キャンセル

  • koromo_t

    2018/05/20 21:03 編集

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

    キャンセル

回答 1

checkベストアンサー

+3

こちら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は取得不可のようです。

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

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

[参考]

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/20 21:09 編集

    回答ありがとうございます!
    なるほど、理解しました。

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

    キャンセル

  • 2018/05/20 21:25

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

    キャンセル

  • 2018/05/20 22:46 編集

    > IFTTTからのデータの書き込みであっても、スクリプトは動くようです。

    厳密には手動実行が対象というより、ユーザーからの実行が対象となりますので、
    IFTTT(を含む外部連携サービス)からの操作も対象となるようでしたら、認識を改めないといけませんね。

    ただ、スクリプトが動いた(実行された)という根拠を提示して頂けないとなんとも言えません。
    (コード中のログ記録でシート名が記録されたとか、スクリプトエディタのメニューより 表示→実行トランスクリプト など)

    その上で「実行に失敗した」のなら、どの部分で失敗したのか(エラーが出たのか)、が不明です。
    エラー内容も提示して頂けますか。
    ※coco_bauerさんがご指摘されている点でもあります。

    なお、検証方法として、IFTTTからのデータの書き込みがあった場合の処理として、
    ごくごく簡単な処理をさせてみてください。
    (具体的には提示されているコードの3行目、Logger.log()まで、もしくは単純にLogger.log('OK')など)


    > importrangeでリンクしたときの書き込み、これでもonEdit(e)は動かないのでしょうか。
    おそらく不可なのだとは思いますが…。

    んー、質問されるより、まず、ご自身で検証してみましょう。
    その結果をご報告いただくほうが、このサイトの趣旨である知識の共有につながります。
    もちろん、ご自身の技術と知識レベルの向上にも。


    > パラメータの取得はできないのかもしれませんが…。

    こちらも同様。
    ですが、「動く」のならパラメータは取得できるでしょう。

    キャンセル

  • 2018/05/21 00:39 編集

    報告します。
    どちらも「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 09:21 編集

    > 【質問文の「追記」の状態(onEdit(e)を使った場合。トリガーなし)】
    上記はただ過去の動作情報が残っていただけで、

    実行日時とログの記録日時が明らかに異なるということですね。
    だとしたら実行されないのは想定通りですね。
    ただし、理由としてはユーザー自身の処理ではないから、ということでしょうね。


    > 【質問文の「追記2」の状態(関数名をzenbu()として、トリガーを値の変更時にした場合)】
    3行目のLogger.logでは「生ログ」が取得され、スクリプトが実行された。

    5行目ですね。了解しました。
    端から自動実行は対象外という認識でしたので、未検証のままでした。
    編集権限のあるユーザーからの処理、というGAS側の認識なのでしょうね。


    > IFTTTからのデータの書き込みであっても、スクリプトは動くようです。
    パラメータの取得はできないのかもしれませんが…。

    気になったので検証しました。
    パラメータ、取得できます。

    キャンセル

  • 2018/05/22 02:08

    回答ありがとうございます!
    いただいた通りにスクリプトを修正したところ、期待通りの結果を得ることができました!
    検証もしていただいたようで、ありがとうございます!
    いろいろと勉強になりました。

    ところが、パラメータを利用したことが原因なのかわからないのですが、
    もともと1秒かそこらで完了していたはずのこのスクリプトが、
    なぜか完了までに90秒ぐらいかかるようになってしまいました。
    これは新たな問題だと思うので、新しく質問記事を投稿しました。
    もしよければ、そちらも見ていただけるとありがたいです。
    こちら→https://teratail.com/questions/127276

    あと…、
    > 5行目ですね。
    そうでしたね…(笑)、誤記でした。

    キャンセル

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

  • ただいまの回答率 90.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Google Apps Script

    947questions

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