GASサンプル Y!Fから上場日一覧取得

スクレイピングは禁止されてるので実際には使わないでね。

function myFunction() {
  
  var book = SpreadsheetApp.getActiveSpreadsheet();
  var sheetData = book.getSheetByName("シート1");

  var colID = 1;
  var colURL = 2;
  var colContributeCount_code = 1;
  var colContributeCount_date = 2;
  
  var rowStartData = 2
  var rowEndData = sheetData.getDataRange().getLastRow()
  
  var start_i = 0;
  var page = 70;
  while(1){
    try {
      var i = start_i;
      var url = 'https://info.finance.yahoo.co.jp/ranking/?kd=41&tm=d&vl=a&mk=1&p=' + page.toString(10);
      var response = UrlFetchApp.fetch(url);
      var html = response.getContentText('UTF-8');  
      var myReCode = /<a href="https:\/\/stocks.finance.yahoo.co.jp\/stocks\/detail\/\?code\=(\d{4})\./g;
      var myReDate = /<td class="txtcenter bgyellow01">(\d{4}\/\d{1,2}\/\d{1,2}?)<\/td>/g;
      var myArray;

      var arr_code = [];
      var arr_date = [];
      
      var i_max = 0;
      while ((myArray = myReDate.exec(html)) !== null)
      {
        arr_date[i] = myArray[1];
        i++;
      }  

      i = start_i;
      while ((myArray = myReCode.exec(html)) !== null)
      {
        arr_code[i] = myArray[1];
        i++;
      }  

      // 1ページ目で大体終わりなので抜けるようにしとく
      // データ更新するときなどはここコメントアウトすると良いでしょう
      break;
      
      page++;
      start_i = i;

      Utilities.sleep(1000);
      
    }catch (ex) {
      break;
    }
  }
  i_max = i;
  
  // コードでA列を検索。なかったら追加
  i = 0;
  while (i < i_max) {

    var col = get_array(sheetData,"A");
    var i_code = parseInt(arr_code[i],10);
    var row = get_row(i_code,"A",sheetData);
    
    if( row == 0 ){
      sheetData.insertRowBefore(1);
      sheetData.getRange(1, colContributeCount_code).setValue(arr_code[i]);
      sheetData.getRange(1, colContributeCount_date).setValue(arr_date[i]);
    }else{
      //既存のデータが見つかったらその時点で終了とする
      break;
    }
    i++;
    
  }
  
  Browser.msgBox("確認", "終了!", Browser.Buttons.OK);
  
}

function get_row(key, col, sh){
 var array = get_array(sh, col);
 var row = array.indexOf(key) + 1;
 return row;
}

function get_array(sh, col) {
  var last_row = sh.getLastRow();
  var range = sh.getRange(col + "1:" + col + last_row)
  var values = range.getValues();
  var array = [];
  for(var i = 0; i < values.length; i++){
    array.push(values[i][0]);
  }
  return array;
}

Gmailでのメール一括送信スクリプト(スプレッドシートとドキュメントを使って定例文送信)

Googleドキュメントにメールの定例文書く

{名前} 様

お世話になっております。

云々


------------------
株式会社shikaku

URLのIDをメモっておく


Googleスプレッドシートに以下のような感じでリスト作成
f:id:shikaku:20190420215354p:plain

ツール>スクリプトエディタで以下のようにコード書く

function SendMail(){
  
  var MySheet=SpreadsheetApp.getActiveSheet(); //シートを取得
  var RowSheet=MySheet.getDataRange().getLastRow(); //シートの最終行を取得
  var ColSheet=MySheet.getDataRange().getLastColumn(); //シートの最終列を取得
  var StrFrom="test@test.jp"; //差出メールアドレス
  var StrSender="差出人です"; //差出人名
 
  for(var i=2;i<=RowSheet;i++){
    
    var StrName=MySheet.getRange(i,2).getValue(); //名前
    var StrTo=MySheet.getRange(i,3).getValue(); //送付するアドレス
    
    if( StrTo == "" ){
      break;
    }
    
    var StrBcc="bcc@test.jp"
    var StrSubject="メールタイトル"
    var SendDoc="1F6L5jm9WQNOMicSI_5XYFhogehoge4XnuAg-48kY4Y8es"; //ドキュメントID
    var DocMail=DocumentApp.openById(SendDoc); //ドキュメントIDからドキュメントを取得
    var StrDoc=DocMail.getBody().getText(); //ドキュメントの内容を取得
    var StrBody=StrDoc.replace(/{名前}/,StrName); //名前を置換
    
    GmailApp.sendEmail(
      StrTo, //toアドレス
      StrSubject,  //表題
      StrBody, //本文
      {
        bcc: StrBcc,    //BCCアドレス 
        from: StrFrom, //fromアドレス
        name: StrSender //差出人
      }
    ); //Gmailで送信する命令
  }
}

あとは▶で実行。

最初はセキュリティの警告出るけど、許可してあげて下さい。

エラーの対処方法1

fromの部分で「無効な引数: <メールアドレス>」と表示されたら、Gmailのほうでfromで指定したメールアドレスをエイリアス登録してないといけない、というエラーです。

以下URLの手順で追加すること。

エラーの対処方法2

https://www.googleapis.com/auth/documents だなんだとエラーがでたらマニフェストの設定が必要な可能性がある。

スクリプトエディタのメニューから 表示>マニュフェスト ファイルの表示 をして以下のように、編集or追記

  "oauthScopes": ["https://www.googleapis.com/auth/script.send_mail", "https://www.googleapis.com/auth/spreadsheets", "https://www.googleapis.com/auth/gmail.modify","https://www.googleapis.com/auth/documents"]

詳細は以下URLを

1日に送信できるメール数

G-Suiteの契約をしている場合は最大2000通まで送れるのですが、そうでない普通のGoogleアカウントの場合、1日最大100通までしか送れないです。

ワイメールからメルマガ送信したら届かない問題

4/26現在、相変わらずGMailに届かない。

https://www.y-ml.com/help/junk-mail/156-deliv-error-to-hotmailにある
【方法2】 一時的に他のメールサーバをリレーさせ送信する
を使って
SendGridのSMTP経由するようにしたら、とりあえず届くようにはなった。

ワイメールでの設定方法はこちら。
https://www.y-ml.com/manual.pdf#page=46

 

4/17現在、ブラックリストに載ってしまってワイメールからメールが届かない問題発生中。

メルマガ配信ドメインのIP調べる

こちらから

各種ブラックリストに載ってないかチェック

こちらでチェックできる。

BARRACUDAに直訴

こちらを参考にしましょう

Gmailに直訴

手順はこちら。

SMTPエラーと送信したメールのヘッダが必要。

まともに届くメールアドレスとgmailアドレス宛にダミーのメルマガからダミーメールを送信。
ワイメールの配信履歴一覧から対象メールの「件名」をクリック。
「受信先又は転送先のアカウントが存在しない」の数字部分をクリック
メールログという小さいリンクがあるのでクリック
するとログが表示されるので、これをSMTPエラーとして貼り付ける。

送信したメールのヘッダは、まともに受信できるメールで受信してヘッダ表示して貼り付ける。