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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Google フォーム

Google フォームは、 Google社が提供しているアンケートフォーム作成および集計ができる無料のツール。Googleアカウントがあれば利用が可能です。集計データは、スプレッドシートに収集され、データ分析もできます。

Q&A

解決済

2回答

4860閲覧

GASでトリガーを作るスクリプトについて

qCGyznFrjUQlyLJ

総合スコア13

Google フォーム

Google フォームは、 Google社が提供しているアンケートフォーム作成および集計ができる無料のツール。Googleアカウントがあれば利用が可能です。集計データは、スプレッドシートに収集され、データ分析もできます。

0グッド

0クリップ

投稿2019/03/06 13:49

前提・実現したいこと

GoogleAppScriptについて質問です。
フォーム提出をトリガーとしたスクリプトを書こうと思っています。
本来トリガーのページ?のようなところから設定できるはず何ですが。

発生している問題・エラーメッセージ

スプレッドシートとフォームとのリンクを切っているためか、トリガーがどうやら作用していません。
そこでスクリプトに直接トリガーを作ってしまおうと思っています。しかし下のスクリプトではエラーはない(デバッグでも問題なし)のに思った結果を返してくれません。

該当のソースコード

GAS

function myfunction() {
var ss = SpreadsheetApp.openById('ID!');
var dataA = ss.getSheetByName('NAME!');
var form1 = FormApp.openById('formID');
var responses1 = form1.getResponses();
var new_response = responses1[responses1.length-1].getItemResponses();
var id = parseInt(1000+responses1.length);
var answers = [id];
for(var i=0; i<new_response.length; i++){
answers.push(new_response[i].getResponse());
dataA.getRange(2+responses1.length,i+1).setValue(answers[i]);
}
}

function onSend(){
ScriptApp.newTrigger(form1dataA).forForm('formID').onFormSubmit().create();

}

試したこと

時間主導でのトリガーでは問題ありませんでした。
はじめは.creaate()メソッドを抜いていたのですが、うまくいかなかったので付け足しました。この辺りに関する日本語のサイトが数えるほどしかなく、調べるのに苦労している現状です。

補足情報(FW/ツールのバージョンなど)

①そもそもトリガーをスクリプトで記述するような事態であるかどうか
②トリガーについて新しい関数を作る必要があるのか
③トリガーに関する記述はどこが間違っているのか、というかこれはトリガーを作ることを指しているのか具体的な意味は??

を教えていただきたいです。
ネットで調べた生半可な知識で書いているので理解不十分な程お許し下さい。見よう見まねで書いたプログラムについてどうかご意見頂きたいです。

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

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

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

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

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

guest

回答2

0

申し訳ありません。
やっぱりmyfunctionが原因でした。
//で1度処理を隠していたので結果が見えなかったみたいです。ご迷惑をお掛けしました。

最後に1つ訊かせていただきたいのですが、やはりフォームエディタから開くスクリプトエディタでトリガーを設定する必要がありますか?

投稿2019/03/07 00:40

qCGyznFrjUQlyLJ

総合スコア13

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

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

nmoa

2019/03/07 03:46

手動でトリガーを設定するなら、おっしゃっている通り フォームエディタ > スクリプトエディタ > 現在のプロジェクトのトリガー と辿っていって設定するのが良いと思います。
guest

0

ベストアンサー

1. トリガーをスクリプトで記述する事態かどうか

記述する必要はありません。
トリガーそのものをプログラムで管理したいならスクリプトで記述する必要がありますが、今回の場合は一度「フォームが送信されたら関数を実行する」というトリガーを手動で設定できれば十分かと思われます。

2. トリガーについて新しい関数を作る必要があるのか

1.でも述べたように、トリガをプログラムで管理する必要はないので、関数も作らなくて良いです。

3. トリガーに関する記述はどこが間違っているのか

トリガーが作用しないのは、そもそもトリガーが全く設定されていないためです。onSend()はGASに元から組み込まれているトリガー関数ではないため、自分で設定しない限りはフォームが送信されても自動で実行されません。
GAS組み込みのトリガー関数は 公式リファレンス に記載されています(英語で申し訳ないですが)

ちなみに、newTrigger()以下も引数が間違っているのでこのままでは動きません。詳しくはリファレンスのサンプルコードを見てください。

ではどうすれば良いのか

手動でトリガーを設定しましょう。
スクリプトエディタから、[編集] > [現在のプロジェクトのトリガー] でトリガーの管理画面が開くので、フォーム送信時にmyfunction()が動くようにトリガーを設定すればよいでしょう。

お役に立てれば幸いです。

投稿2019/03/06 15:27

nmoa

総合スコア54

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

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

qCGyznFrjUQlyLJ

2019/03/06 17:00

ありがとうございます。 やっぱりネットで少し調べる程度では引数の正しさなんて判別も出来ませんね。手動で可能との事でしたが、まさにそのトリガーの管理画面からフォーム提出時に動かそうとすると上手くいかないようなのです。 これはどこが間違っているのでしょうか。 具体的な状況説明が出来ず申し訳ありません。
nmoa

2019/03/06 17:34

なるほど。考えられる原因は、 ・トリガーを手動で設定したのに正しくトリガーが働いていない ・myfunction() の中身が間違っている のいずれかでしょう。 以下の2点確認していただけませんか。 ・トリガーを設定した状態でフォームを送信した後、トリガーの管理画面で[前回の実行]欄の日付が更新されるか ・スクリプトエディタからmyFunction()を実行し、自分の意図した動作が行われているか
nmoa

2019/03/06 17:38

もう一つ。 > ネットで少し調べる程度では引数の正しさなんて判別も出来ません と書かれておられますが、GoogleAppsScriptに関しては公式リファレンスが充実しているので非常に参考になります。英語でとっつきにくいかもしれませんが、サンプルコードを見ながら雰囲気を掴むだけでもだいぶ理解が進むと思いますので、ぜひリファレンスを覗くようにしてみてください。
qCGyznFrjUQlyLJ

2019/03/07 00:29

前回の実行欄は空欄のままでした。スクリプト自体は時間主導のトリガーでは問題なく動くため問題ないはずです。 別の方からはスプレッドシートから開いたスクリプトエディタだから出来ないかもしれないとのことで、フォームからスクリプトエディタを開き同様のトリガーを設定しましたがこちらも動きませんでした(前回の実行も表示されませんでした)
qCGyznFrjUQlyLJ

2019/03/07 00:33

すみません確認ミスでした。 フォームから開いたスクリプトエディタて設定したトリガーは実行した履歴もありませんでしたが、 元々作ったスプレッドシートから開いたスクリプトエディタで設定したトリガーでは実行した履歴が表示されました。ただエラー率は100%で、関数名をmyfunction()にしたはずですが、履歴では関数名にスクリプトの中身が全て書かれていました。(myfunction(){ ~~~})
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問