【GAS】スプレッドシートにGmailからスクレイピング~抜き出したデータの整理と関数化~【第3回】

前回は、スプレッドシートに書き込みたい情報をとりあえず抜き出してログに表示させてみました。今回は、抜き出した情報をスプレッドシートに書き込める状態にしてログに表示させたいと思います。

今回やること

前回抜き出した情報だと、例えば計算100の場合は['計算100\n・1分55秒86(’]というように、スプレッドシートにそのまま書き込めるような情報ではありませんでした。スプレッドシートに書き込むなら「1分55秒86」か「1:55.86」という情報だけが欲しいですよね。

また、matchする際の正規表現は同じものを使うので、もう少しコードをわかりやすくするために関数を使っていこうと思います。

replace

replaceメソッドでいらない文字列を置換したり、削除しようと思います。置き換える文字列を空白に指定すれば削除ができます。

replaceメソッドでは、正規表現も使えます。

文字列.replace(変更前文字列,置換する文字列)

GAS

matchメソッドでは、検索パターンに一致した文字列の配列を返すので、matchを使った定数は配列で指定しています。

function myFunction() {
  
  const query ='さんの脳トレ記録をお届けします。';
  const start = 0;
  const max = 10;

  const threads = GmailApp.search(query,start,max);

  for(const thread of threads){
    const messages = GmailApp.getMessagesForThread(thread);

    for(const message of messages){
      const plainBody = message.getPlainBody();
      const calc100 = plainBody.match(/計算100\s・(.*)(/g);
      const people = plainBody.match(/人数数え\s・(.*)問/g);

      if(calc100 !== null){
        var calc1001 = calc100[0].replace(/計算100\s・/g,'').replace('(','');
        calc1001 = calc1001.replace('分',':').replace('秒','.');
        console.log(calc1001);
      }
      if(people !== null){
        var people1 = people[0].replace(/人数数え\s・/g,'').replace('/6問','');
        console.log(people1);
      }
    }
  }
}

実行結果

要らなかった文字列を削除して、分や秒をスプレッドシートで扱いやすい形に変換しておきました。

new RegExp(正規表現,フラグ)

RegExpに正規表現のパターンやフラグを入れおいて、matchの文を見やすくするのに使います。関数を作る時に便利です。正規表現の文字列を変数にいれたりして使います。

関数を作る

matchするときに同じような動作が続きます。もっとmatchする項目が増える予定なので、関数化してわかりやすく扱えるようにします。

今回作ったのは2つで、1つはmatchしてreplaceする関数です。もう1つは、分秒を整える関数で、replaceしてくれます。

GAS全体

function myFunction() {
  
  const query ='さんの脳トレ記録をお届けします。';
  const start = 0;
  const max = 10;

  const threads = GmailApp.search(query,start,max);

  const fetchData = (str ,pre ,suf) =>{
    const reg = new RegExp(pre + '.*?' + suf,'g');
    const preg = new RegExp(pre,'g');
    var data = str.match(reg);
    var data1 = null;
    if(data !== null){
      data1 = data[0].replace(preg,'').replace(suf,'');
    }
    return data1;
  };

  const moment = (str1) =>{
    const minute = str1.replace('分',':').replace('秒','.');
    return minute;
  };

  for(const thread of threads){
    const messages = GmailApp.getMessagesForThread(thread);

    for(const message of messages){
      const plainBody = message.getPlainBody();
      const calc100 = fetchData(plainBody,'計算100\\s・','(');
      const people = fetchData(plainBody,'人数数え\\s・','/6問');

      if(calc100 !== null){
        var calc1001 = moment(calc100);
        console.log("計算100:"+calc1001);
      }
      if(people !== null){
        var people1 = moment(people);
        console.log("人数数え:"+people1);
      }
    }
  }
}

実行結果

最後に

今回は、抜き出したデータのいらない部分を削ったり置き換えたりするデータの整理と、matchやreplaceを関数化しました。

次回は、脳トレ実施時の日付を取り出したりデータを配列に入れて整理したいと思います。