かずきち。の日記

サーバサイドエンジニアのつぶやき

【プログラマー×投資家向け】Googleフォームから動的な情報収集カレンダーを重複無しでGoogleAppsScript40行で作っていく【情報収集】

情報収集を毎日定期的に行ってくれるカレンダーを作成したい

世の中では投資目的で特定の会社が投資家向けにIR情報を出している。
「2024年度3月度決算」など各企業はいろんな情報を公開している。
いちいち各企業のサイトに飛ぶのはめんどくさいので、今回はGoogleフォームを使って動的に情報集するプログラムを作っていく。

作り方は
①まず情報収集したい企業名をGoogleフォームを使って収集
②次にすでに自分の所有するカレンダー群に該当の企業名のカレンダーがないか判定をかける。
③判定フラグが0の場合は該当のカレンダーがないので、新規にカレンダーを作成する。
 判定フラグが1の場合はすでに該当のカレンダーが存在するので、カレンダーIDを返却する。

この3つの方針で作成していく。

①の工程でまずは該当のGoogleフォームを作成していく

ただ企業の情報を収集したいので企業名を入力するだけのフォームを作成する。

回答にはこのようなタイムスタンプと企業名が入ったシートが完成するようにフォームを作る。

③の工程では入力された企業名のGoogleカレンダーがすでに存在するのかの判定していく
//スプレッドシートIDを元にスプレッドシートを取得するサンプルコード
function sampleCodeForOpenSheetById(){
  const sheet1 = SpreadsheetApp.openById("先程のフォームで回収した回答のスプレッドシートのid").getSheetByName("フォームの回答 1");
  //const value1 = sheet1.getRange('A1').getValue();
  //console.log(value1);

  //スプレッドシートを取得
  let mySheet = SpreadsheetApp.getActiveSheet();
  
  //読み込んだシートの最終行を取得する
  let lastRow = mySheet.getLastRow();
  const value = sheet1.getRange('B'+lastRow).getValue();
  console.log(value);

  //すでに同一名称のカレンダーがあるか?
  let calendars = CalendarApp.getAllCalendars();
  //カレンダー有無フラグ
  let flag = 0;

  for (let i in calendars) {
    let calendar = calendars[i];
    let calendarName = calendar.getName();
    if(value == calendarName){
        console.log("すでに存在してるよ");
        let flag = 1;
    }
  }
  
  //カレンダーの有無調査
  console.log(flag);

  if(flag = 0){
    CalendarApp.createCalendar(value+"カレンダー");
    console.log("新規にカレンダーを作るよ");
  }else{
     var already = CalendarApp.getCalendarsByName(value+"カレンダー");
     console.log(already[0].getName()+"はすでにあるよ");
      console.log(already[0].getId());
  }
}

のプログラムを走らせる。

今回はすでにGooggleに関する情報を収集するプログラムが自動で走っているか判定をかける。

さくっと40行ほどで今回入力した企業名のカレンダーが存在するか判定して、Googleという企業に関する情報を収集する。
0の場合はカレンダーがない、1の場合はすでにカレンダーが存在するフラグを立てる。

8224e5a7cb2a6fbfd2054178ac6534a8aad75fff064beaeafb4df9bf61e8baae@group.calendar.google.com

というカレンダーIDですでに存在しているのでプログラムは新規に作成して、ない場合は新規に作る。
ここで特定の企業名の情報を格納する「箱」が完成したことになる。

function getgooglenews() {

  // url設定

  var url = 'https://news.google.com/rss/search?hl=ja&gl=JP&q=(気になる企業名に変更)&ceid=JP:ja';

  // namespace設定

  var namespace = XmlService.getNamespace("ht",'https://news.google.com/rss/search?hl=ja&gl=JP&q=GoogleAppsScript&ceid=JP:ja');

  // rss取得

  var xml = UrlFetchApp.fetch(url).getContentText();
  var document = XmlService.parse(xml);
  var root = document.getRootElement();
  var channel = root.getChild("channel");
  var items = channel.getChildren("item");
  var link = channel.getChildren("link");

  // sheetに記入

  var sheet = SpreadsheetApp.getActiveSheet();
  var length = items.length;
  var today = new Date();
  var Month = today.getMonth() + 1;

  for(var i = 0; i < length; i++) {

    var title = items[i].getChildText("title");
    var link = items[i].getChildText("link");
    var traffic = items[i].getChildText("approx_traffic",namespace);

    Logger.log(link);
    
    //登録するカレンダーIDを呼び出してeventへ格納
    var calendar = CalendarApp.getCalendarById('先ほど作成したカレンダーIDを動的取得@group.calendar.google.com');
    
    //イベントのタイトルをtitleへ格納
    Logger.log(title);
    
    var date = new Date();
    // 今日の日付を表示
    Logger.log(Utilities.formatDate( date, 'Asia/Tokyo', 'yyyy/MM/dd'));
    var today = Utilities.formatDate( date, 'Asia/Tokyo', 'yyyy/MM/dd');
    const option = {
    description: link,
    location: '345 Spear StreetSan Francisco, CA 94105 United States'
  }
    
    Logger.log(today);

ここではカレンダーに動的に情報を記入していく。
つまるとこ何をしてるかというと…
フォームにGoogleと書けばGoogleに関する情報を記載するプログラムを書いた。
最後に情報収集する時刻のトリガーを設定すれば未来永続動くようになる。

どんな人に役立つか?

特定の企業の情報を収集するのは人間が収集するのは簡単だ。
機械が自動で未未来永劫情報収集するのはGoogleフォーム×Googleスプレッドシート×GoogleAppsScriptで自動化しなければならない。
この作業は投資家にとっては企業名を入力さえすれば、あとはその企業のカレンダーを作って追記して行ってくれるので非常に助かる。