実現したいこと
フォームの送信時に実行する関数を、他のスプレッドシートから
GASにてトリガー設定をしたい。
対象となるスプレッドシート(エクセルだとブックに相当)が50以上あり
毎回これを手作業で設定するのが大変
スプレッドシートのIDは自動で取得できているので
これを自動で行いたい
発生している問題・分からないこと
トリガーを設定したいスプレッドシートのエディタ側にて
トリガー設定のコードを実行すると
トリガーの設定は確認できたが
他のスプレッドシートから、トリガー設定したいスプレッドシートを
IDで指定して実行すると、エラーにはならず完了するが、
トリガーは設定されていない
IDは間違いなく取得できている
該当のソースコード
function test(){ const Sh = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); const ShID = Sh.getRange(7,2).getValue(); Logger.log(ShID) 各スプレッドシートにフォーム送信時トリガーを自動セット(ShID); } function 各スプレッドシートにフォーム送信時トリガーを自動セット(ShID){ let ss = SpreadsheetApp.openById(ShID); ScriptApp.newTrigger('送信時の転記処理').forSpreadsheet(ss).onFormSubmit().create(); }
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
調べたがわからなかった
補足
特になし
トリガーを設定するスプレッドシートには「送信時の転記処理」という関数はありますか?
回答ありがとうございます
はい あります
トリガーを設定するスプレッドシート側にて
ActiveSpredsheetとして実行すると
トリガーは設定されます
IDの記載は間違えていません
function 各スプレッドシートにフォーム送信時トリガーを自動セット(ShID){
let ss = SpreadsheetApp.openById(ShID);
ScriptApp.newTrigger('送信時の転記処理').forSpreadsheet(ss).onFormSubmit().create();
}
のIDから取得したスプレッドシートssのどこか適当なセルの値を読み込んでログ出力するなどして
確実にスプレッドシートが取得できているか確認してみてはどうでしょうか?
function test(){
const Sh = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const ShID = Sh.getRange(7,2).getValue();
Logger.log(ShID)
各スプレッドシートにフォーム送信時トリガーを自動セット(ShID);
}
function 各スプレッドシートにフォーム送信時トリガーを自動セット(ShID){
let ss = SpreadsheetApp.openById(ShID);
ss.getSheetByName('フォームの回答 1').getRange(1,2).setValue(123);
ScriptApp.newTrigger('送信時の転記処理').forSpreadsheet(ss).onFormSubmit().create();
}
にて、該当するスプレッドシートのセルに123と入る事を確認しました
しかしトリガーは相変わらずセットされません・・・
https://auto-worker.com/blog/?p=6397
ここを参考にしていますが、
コンテナバインド型でなくてもスプレッドシートトリガー設定可能
という部分において仕様変更等があったのか?
という事も思い始めたところです・・
.forSpreadsheet()は、トリガーの起動元となるフォームが送信されるスプレッドシートを指定しますが、
トリガーを設定するファイルを指定するものではないです。
トリガーは、「各スプレッドシートにフォーム送信時トリガーを自動セット」という名前の
トリガー設定の関数が保存されているファイルに設定されているのではないでしょうか?
おそらくこれまで試された数のトリガーが。
指定(IDでも指定可)のスプレッドシートにフォームからの送信が蓄積されたときに、
トリガー設定の関数が保存されていて、その関数によりトリガーが設定されたファイルの方で
送信時の転記処理という関数を探して
関数が見つからないエラーになっていると思います。
課題解決につながらないので、コメントとしました。
すみません
理解が追い付いていないです・・
参考にしたURLのものでは、
コンテナバインド型でなくてもスプレッドシートトリガー設定可能
とあります。
なお、前述のスプレッドシートトリガーのサンプルコードでは、newTriggerの引数にSpreadsheetApp.openByIdで読み込んだスプレッドシートを設定しています。
通常のGoogle Apps Script(GAS)のスクリプトエディタでスプレッドシートトリガーを設定する場合、スプレッドシートに紐づくコンテナバインドスクリプトである必要があります。
しかし、 ScriptApp.newTriggerメソッドの場合、コンテナバインドではないスタンドアロンなGASでスプレッドシートを読み込んでトリガー設定できます。
と書かれており、対象となるスプレッドシートも
forSpreadsheet(ss)で指定しています
どこが問題なのかさっぱりです。。
いずれにしても、
50以上のスプレッドシートに「送信時の転記処理」という関数をコピペすることになるのでしょうから、
そのファイルへのトリガー設定の関数も含めて一括してコピペして、
保存後にトリガー設定の関数を一度実行すればいいのではないでしょうか。
各スプレッドシートにフォーム送信時トリガーを自動セット
という関数が保存されているスクリプトエディタでトリガーを確認してみてください。
私のコメントの最初の2行の意味がご理解いただけると思います。
スタンドアローンのスクリプトでも、
forSpreadsheet(ssId等)を使って、
ssId等で指定のスプレッドシートにフォームから回答が送信されたときに、
そのスタンドアローンのスクリプトをトリガーで起動するようにできるので、
そのことを誤解されたのではないでしょうか。
という事は無理という事ですね
ならば諦めます・・
関数のコピペはしません
スプレッドシートをコピーして50個作ります
この時、関数はコピーされますが、
トリガーはコピーされません
スプレッドシートのコピーはフォームとの紐づけがあるので
仕方なく手作業で行いますが、トリガー設定は
面倒なので自動化したいと思いました
今回は諦めるしかないようです・・