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

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

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

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

Q&A

1回答

240閲覧

GASで他のスプレッドシートにトリガー設定をしたい

punpun21

総合スコア23

Google Apps Script

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

0グッド

1クリップ

投稿2024/02/26 00:38

実現したいこと

フォームの送信時に実行する関数を、他のスプレッドシートから
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等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

調べたがわからなかった

補足

特になし

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

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

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

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

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

YAmaGNZ

2024/02/26 01:48

トリガーを設定するスプレッドシートには「送信時の転記処理」という関数はありますか?
punpun21

2024/02/26 02:06

回答ありがとうございます はい あります トリガーを設定するスプレッドシート側にて ActiveSpredsheetとして実行すると トリガーは設定されます IDの記載は間違えていません
YAmaGNZ

2024/02/26 02:14

function 各スプレッドシートにフォーム送信時トリガーを自動セット(ShID){ let ss = SpreadsheetApp.openById(ShID); ScriptApp.newTrigger('送信時の転記処理').forSpreadsheet(ss).onFormSubmit().create(); } のIDから取得したスプレッドシートssのどこか適当なセルの値を読み込んでログ出力するなどして 確実にスプレッドシートが取得できているか確認してみてはどうでしょうか?
punpun21

2024/02/26 02:28

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と入る事を確認しました しかしトリガーは相変わらずセットされません・・・
punpun21

2024/02/26 03:05

https://auto-worker.com/blog/?p=6397 ここを参考にしていますが、 コンテナバインド型でなくてもスプレッドシートトリガー設定可能 という部分において仕様変更等があったのか? という事も思い始めたところです・・
YellowGreen

2024/02/26 03:25 編集

.forSpreadsheet()は、トリガーの起動元となるフォームが送信されるスプレッドシートを指定しますが、 トリガーを設定するファイルを指定するものではないです。 トリガーは、「各スプレッドシートにフォーム送信時トリガーを自動セット」という名前の トリガー設定の関数が保存されているファイルに設定されているのではないでしょうか? おそらくこれまで試された数のトリガーが。 指定(IDでも指定可)のスプレッドシートにフォームからの送信が蓄積されたときに、 トリガー設定の関数が保存されていて、その関数によりトリガーが設定されたファイルの方で 送信時の転記処理という関数を探して 関数が見つからないエラーになっていると思います。 課題解決につながらないので、コメントとしました。
punpun21

2024/02/26 03:28

すみません 理解が追い付いていないです・・ 参考にしたURLのものでは、 コンテナバインド型でなくてもスプレッドシートトリガー設定可能 とあります。 なお、前述のスプレッドシートトリガーのサンプルコードでは、newTriggerの引数にSpreadsheetApp.openByIdで読み込んだスプレッドシートを設定しています。 通常のGoogle Apps Script(GAS)のスクリプトエディタでスプレッドシートトリガーを設定する場合、スプレッドシートに紐づくコンテナバインドスクリプトである必要があります。 しかし、 ScriptApp.newTriggerメソッドの場合、コンテナバインドではないスタンドアロンなGASでスプレッドシートを読み込んでトリガー設定できます。 と書かれており、対象となるスプレッドシートも forSpreadsheet(ss)で指定しています どこが問題なのかさっぱりです。。
YellowGreen

2024/02/26 03:39

いずれにしても、 50以上のスプレッドシートに「送信時の転記処理」という関数をコピペすることになるのでしょうから、 そのファイルへのトリガー設定の関数も含めて一括してコピペして、 保存後にトリガー設定の関数を一度実行すればいいのではないでしょうか。
YellowGreen

2024/02/26 03:48 編集

各スプレッドシートにフォーム送信時トリガーを自動セット という関数が保存されているスクリプトエディタでトリガーを確認してみてください。 私のコメントの最初の2行の意味がご理解いただけると思います。 スタンドアローンのスクリプトでも、 forSpreadsheet(ssId等)を使って、 ssId等で指定のスプレッドシートにフォームから回答が送信されたときに、 そのスタンドアローンのスクリプトをトリガーで起動するようにできるので、 そのことを誤解されたのではないでしょうか。
punpun21

2024/02/26 03:44

という事は無理という事ですね ならば諦めます・・ 関数のコピペはしません スプレッドシートをコピーして50個作ります この時、関数はコピーされますが、 トリガーはコピーされません スプレッドシートのコピーはフォームとの紐づけがあるので 仕方なく手作業で行いますが、トリガー設定は 面倒なので自動化したいと思いました 今回は諦めるしかないようです・・
guest

回答1

0

トリガーを設定する際にアクセス権の許可を求められると思いますので、
それぞれのスプレッドシートごとの操作は省略できないのではないでしょうか。

例えば、次のようなスクリプトを保存しておいたスプレッドシートを
コピペで作成してからそれぞれのシートを開いて、
メニュー>初期設定>トリガー設定をクリックし、
アクセス権の許可をしてから、もう一度
メニュー>初期設定>トリガー設定をクリックするのはやはり手間なのですね。

JavaScript

1function setTrigger() { 2 let isTriggerExist = false; 3 const triggers = ScriptApp.getProjectTriggers(); 4 for (const trigger of triggers) { 5 if (trigger.getTriggerSource() == ScriptApp.TriggerSource.SPREADSHEETS && 6 trigger.getHandlerFunction() == '送信時の転記処理') { 7 isTriggerExist = true; 8 } 9 } 10 if (!isTriggerExist) { 11 ScriptApp.newTrigger('送信時の転記処理').forSpreadsheet(SpreadsheetApp.getActive()).onFormSubmit().create(); 12 } 13} 14function onOpen() { 15 SpreadsheetApp.getUi() 16 .createMenu('初期設定') 17 .addItem('トリガー設定', 'setTrigger') 18 .addToUi(); 19}

投稿2024/02/28 04:11

YellowGreen

総合スコア731

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

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

punpun21

2024/02/28 05:12

回答ありがとうございます トリガーごとコピペで来たらどんなに楽な事か・・・ 毎回50のスプレッドシートを自動で作成し それに連携したFormの送信アクションでスクリプトを 走らせたいと希望しています トリガー以外のものは全て自動化出来たので ネックはこれのみでした・・・ 何らかの手動操作が、スプレッドシートの数だけ必要なら トリガー設定自体が自動で出来たとしても意味が無いです 本当にあきらめるしかないようです・・orz
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問