2017-09-15 18 views
0

Googleスプレッドシートのスクリプトを使用して、フォーム提出時に既存のスプレッドシートとGoogleフォームをコピーして新しいスプレッドシートと新しいフォームを作成し、新しいスプレッドシートに新しいスプレッドシートが新しいフォームからの応答を受け取るようにします。Google Apps Script - コピーされたスプレッドシート内のスクリプトがトリガーを保持しない

コピーされたスプレッドシートのスクリプトが新しいスプレッドシートにコピーされますが、インストールされたトリガーは存在しません。元のスプレッドシートのスクリプト(新しいSSとフォームを作成したフォーム送信を受け取ったスプレッドシート)からトリガーを作成する方法はありますか、またはインストールされたトリガーを作成するために新しいスプレッドシートにインストールされていないトリガーに頼る必要がありますか?

答えて

0

トリガーは、ユーザーの承認が必要なスクリプトを実行します。スクリプトはスプレッドシートにバインドされているため、各コピーで承認する必要があります。

私は同様のシステム(マスターシート+コードのコピー)を持っており、誰かがコピーを作成したときにスクリプトを実行するカスタムメニューを追加することでこれを対処しました。私は、トリガーを許可するカスタムメニューとsetupスクリプトを追加しました。

function onOpen(e) { 
    var ui = SpreadsheetApp.getUi().createMenu("PGP Setup").addItem("Run", "setup").addToUi(); 
} 

function setup() { 
    var ss = SpreadsheetApp.getActive(); 
    ScriptApp.newTrigger('makeDocs') 
    .timeBased() 
    .everyHours(1) 
    .create(); 
} 

このシートを作成してこれまで信頼性が高いユーザーは簡単です。

1

以下のコードで問題を解決できました。関数 'newSSTrigger'は元のスクリプト(コピーされていないスクリプト)にあり、新しいSSとフォームが作成されてsyncが実行された後に呼び出されます。これは変数idOfNewSSの元です。トリガーは新しいオブジェクトにスクリプトを作成したり、インストールされたトリガーとして新しいオブジェクトのスクリプトには表示されません。トリガーを見つけるには、スクリプトから編集>すべてのトリガーを選択します。グレー表示されていないトリガは、何らかの方法でドキュメントに添付されています。

これは2つの利点があるようです: 1)私はすべてのアクセス権に対処する必要はありません - 私は新しいドキュメントに触れることなくトリガーが動作します。 2) 'myFunction'(下記)を更新すると、トリガーが元のスクリプトからその命令を現在の状態で取得するため、既存のトリガーの動作が変更されます。つまり、この関数を編集するだけで、このスクリプトで作成された既存のトリガをすべて更新できます。

function newSSTrigger(idOfNewSS) { 
    var newSS = SpreadsheetApp.openById(idOfNewSS); 
    ScriptApp.newTrigger("myFunction") 
    .forSpreadsheet(newSS) 
    .onFormSubmit() 
    .create(); 
} 

function myFunction() { 
    do stuff... 
} 
関連する問題