トリガー発火時、トリガー先の関数に暗黙的に引数が渡されます。、
この引数はシートごとに異なるid(18~19桁の整数)となっています。
したがって、トリガー先に渡すべき引数を、このidと紐づけて、プロジェクトのプロパティストアに保存する 、という戦略になります。
下記、setup()関数の中のworksheetsという配列は、あらかじめ、各々のスプレッドシートidと紐付け先のURLを設定したものになります。
(この部分は、設定用のスプレッドーシートを別に作っておいて、そのシートからセル範囲指定で取得した方が楽かもしれませんが、それはお好みで)
そして、setup()関数を一度だけ実行します。
あとは、各シートを開けば、それぞれに紐付けられた引数(url)が渡されます。
(下のサンプルでは、単純にセルA1にurlが表示されるようになっています)
setup()は一度だけ実行すること。トリガー登録済みの状態で2回以上重ねて実行すると、同じトリガーが複数回発生してしまう。
setup内のworksheets配列を変更し反映させたい場合は、一番下のdelAllTriggers()を実行してトリガーを一度全部削除してから再度setupを実行すること。
GAS
1 // V8以前にも対応できるように敢えて古い書き方をしている。
2
3 // 下記setup()を一度だけ実行する。
4 // テーブルの中身を変更した場合は、delAllTriggers()を実行してから再度setupする。
5 function setup(){
6 //シートIDとスクレイピング対象のURLの対応テーブル
7 var worksheets = [
8 { id:"スプレッドシートID1", url:"スクレイピング対象のurl01" },
9 { id:"スプレッドシートID2", url:"スクレイピング対象のurl02" },
10 { id:"スプレッドシートID3", url:"スクレイピング対象のurl03" },
11 { id:"スプレッドシートID4", url:"スクレイピング対象のurl04" },
12 ];
13
14 for(var i in worksheets){
15 setTriggerFor(worksheets[i]);
16 }
17 }
18
19 // シートごとにトリガーを設定し、triggerIDごとに渡したい引数を保存する
20 function setTriggerFor(sheet) {
21 var file = SpreadsheetApp.openById(sheet.id);
22 var functionName = "runScript"; //トリガーを設定したい関数名
23 var trigger = ScriptApp.newTrigger(functionName)
24 .forSpreadsheet(file)
25 .onOpen().create();
26
27 // 関数に渡す引数をtriggerIDと紐付けして保存
28 var triggerUid = trigger.getUniqueId();
29 var obj = {};
30 obj['args']= {url: sheet.url}; // 「args」は単なる目印。削除の時に便利なので。
31 PropertiesService.getScriptProperties().setProperty(triggerUid, JSON.stringify(obj));
32 }
33
34
35 function runScript(sender) {
36 var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
37
38 // プロパティストアから、idに紐付いた引数を取り出す。
39 var args = getargs(sender.triggerUid);
40
41 // 以下カスタマイズ。シートごとに異なる引数を渡す処理を書く。
42 // 例:セルA1に、個別のURLを書き込む
43 sheet.getRange(1,1).setValue(args.url);
44 }
45
46 // プロパティストアからトリガーのidをキーとして引数を取り出す。
47 function getargs(triggerUid) {
48 var props = PropertiesService.getScriptProperties();
49 var obj = JSON.parse(props.getProperty(triggerUid));
50 return obj['args'];
51 }
52
53 // トリガー/プロパティを全削除する
54 function delAllTriggers() {
55 // トリガーの削除
56 var triggers = ScriptApp.getProjectTriggers();
57 for (var i in triggers){
58 if(triggers[i].getHandlerFunction() == "runScript"){
59 ScriptApp.deleteTrigger(triggers[i]);
60 }
61 }
62
63 // プロパティの削除
64 var prop = PropertiesService.getScriptProperties();
65 var keys = prop.getKeys();
66 for (var i = 0; i < keys.length; i++) {
67 if (JSON.parse(prop.getProperty(keys[i])).args){
68 prop.deleteProperty(keys[i]);
69 }
70 }
71 }
72
73