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

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

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

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

Q&A

解決済

2回答

3415閲覧

ファイルが2つできてしまう

Kodanosuke

総合スコア42

Google Apps Script

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

0グッド

0クリップ

投稿2019/03/07 13:55

前提・実現したいこと

以下のコードをトリガーを用いてフォームが送信されるごとに実行しているのですが、最終的にドキュメントが2つできてしまいます。この原因として何が考えられますでしょうか。

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

エラーメッセージは特にありません。
ドキュメントが重複して作成されてしまうことが問題です。
ドキュメントは2つとも指定の同じフォルダに作成されています。

//① var ssheet = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ssheet.getSheetByName('改修後'); //変数を設定する var alldata = sheet.getRange(sheet.getLastRow(), 3 ,1 ,sheet.getLastColumn()).getValues(); var pre_timestamp = sheet.getRange(sheet.getLastRow(), 1).getValue() var timestamp = Utilities.formatDate(pre_timestamp, "JST", "yyyy/MM/dd") var name_group = alldata[0][0]; var name_rep = alldata[0][1]; var phone_rep = alldata[0][2] var name_bill = alldata[0][3]; var name_place = alldata[0][4]; var date = Utilities.formatDate(alldata[0][5] , "JST" ,"yyyy/MM/dd"); if(alldata[0][6] != ""){ var rehe_start = Utilities.formatDate(alldata[0][6],"JST" ,"HH:mm"); }else{ var rehe_start = []; } if(alldata[0][7] != ""){ var rehe_end = Utilities.formatDate(alldata[0][7],"JST" ,"HH:mm"); }else{ var rehe_end = []; } if(alldata[0][8] != ""){ var per_start = Utilities.formatDate(alldata[0][8],"JST" ,"HH:mm"); }else{ var per_start = []; } if(alldata[0][9] != ""){ var per_end = Utilities.formatDate(alldata[0][9],"JST" ,"HH:mm"); }else{ var per_end = []; } var medi_add = alldata[0][10]; //マスター発送日、プラン、オプション選択を設定する var target = sheet.getRange(sheet.getLastRow(), sheet.getLastColumn()-6, 1, 7) var master = sheet.getRange(sheet.getLastRow(), sheet.getLastColumn()-7) var rule = SpreadsheetApp.newDataValidation() .requireValueInList(['on','off']) .build() target.setDataValidation(rule) var rule2 = SpreadsheetApp.newDataValidation() .requireDate() .build() master.setDataValidation(rule2) var doc = DriveApp.getFileById('XXXXXXXXXX').makeCopy(name_group + '御中 ご依頼内容確認書').getId(); var doc_body = DocumentApp.openById(doc).getBody(); var yobi_list = ["日","月","火","水","木","金","土"]; var cells = [["ご依頼日"," "+timestamp],[" 団体名(奏者名)"," "+name_group],[" 収録担当者様氏名"," "+name_rep + " 様"],[" 電話番号"," "+phone_rep],[" 収録場所"," "+name_place],[" 収録日時"," "+date + "("+ yobi_list[new Date(date).getDay()] + ")"],[" ゲネプロ時間"," "+rehe_start + "-" + rehe_end],[" 本番時間"," "+per_start + "-" + per_end],[" マスター発送予定日"," "],[" お届け先"," "+medi_add + " 様"]]; var table1 = doc_body.appendTable(cells).setColumnWidth(0, 150).setColumnWidth(1, 300); table1.editAsText().setFontSize(9); var cell2 = [["依頼内容・備考等","\n\n"+name_bill+"\n上記のプラン内容にて承りました。"]] var table2 = doc_body.appendTable(cell2).setColumnWidth(0, 150).setColumnWidth(1, 300); table2.editAsText().setFontSize(9) var doc_table = doc_body.getTables() //③ var folder_to = DriveApp.getFolderById('XXXXXXXXXXXXXXXXXXXXXX'); folder_to.addFile(DriveApp.getFileById(doc).setName(name_group + " 御中 ご依頼内容確認書 ")); var test = DriveApp.getFileById(doc) DriveApp.getRootFolder().removeFile(test); } ```Google App Script ソースコード

試したこと

・同じ内容のトリガーが設定されていないか確認しました。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

ベストアンサー

このところ、スプレッドシート側で、フォーム送信時にトリガー指定した関数が多重実行されるという、質問が重なっています。
(ただし2回目以降はイベントパラメータに入るはずのフォームの値が不完全になる模様)

これまでのところ有効な対応策は、フォームのスクリプトとしてフォーム送信時のトリガーをかけると一回に抑制されるとのことでした。

投稿2019/03/08 00:34

papinianus

総合スコア12705

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

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

Kodanosuke

2019/03/11 00:39

回答いただきありがとうございます. フォームのスクリプトとしてトリガーをかけるというのは,スプレッドシートからスクリプトを書く際に,関数名をonFormSubmit(e)にするということでしょうか. よろしくおねがいします.
papinianus

2019/03/11 02:13 編集

フォームの編集画面の右上にある「…」を縦にならべたアイコンから、スクリプトエディタを開き、そこでコードをかいて、作ったコードを「フォームから」「送信時」のトリガをかける、という意味です。 ``` var ssheet = SpreadsheetApp.getActiveSpreadsheet(); ``` ここをSpreadsheetApp.OpenById("シートid");にするという変更が必要です。もしかしたらその他にも変更しないといけないポイントがあるかもしれません。
Kodanosuke

2019/03/11 05:16

ありがとうございます. やってみます!
guest

0

これが直接の解決策になりえるかどうかは分かりませんが、例えばLockServiceを使うのは如何でしょうか。一つの使用例として、ユーザが送信ボタンをダブルクリックしてしまうと2度並行してスクリプトが実行されてしまいますのでこれを回避するためにLockServiceを用いています。

サンプルスクリプト

質問にあるスクリプトの上下に、下記のようにLockServiceを使用するためのスクリプトを挿入してみてください。

javascript

1function myFunction(e) { // 質問から関数名が分からなかったためサンプルとしての関数名です。 2 var lock = LockService.getScriptLock(); 3 lock.waitLock(30000); // スクリプト自体は数秒で終わると思いますが、念のため30秒待つ設定です。 4 5 // ここに実行するスクリプトを入れて下さい。 6 7 lock.releaseLock(); 8}

参考

投稿2019/03/08 00:12

編集2019/03/08 00:15
kisojin

総合スコア899

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問