@kazuya030's memo

kazuya030 のメモ・ノートの垂れ流し。推敲とかしない。

要素が最初に現れた順を記憶するカウンタ by python3

公式ドキュメントにサラッと書いてあるけど理解できない

class OrderedCounter(Counter, OrderedDict):
    'Counter that remembers the order elements are first encountered'

    def __repr__(self):
        return '%s(%r)' % (self.__class__.__name__, OrderedDict(self))

    def __reduce__(self):
        return self.__class__, (OrderedDict(self),)

cf. 8.3. collections — コンテナデータ型 — Python 3.5.1 ドキュメント

{gmailr} を使ってメール頻度をヒストグラムにする

引き続き {gmailr} でメールデータの分析をしてます。 とりあえず日々のメール頻度をヒストグラムにしました。

f:id:kazuya030:20151230002335p:plain

問題点は、メールが100通しかこのままだと取得できないこと。 本当は API で100通以上取得できるはずなのですが、うまくいかないのでそこはまたこれからがんばります。

続きを読む

{gmailr} で gmail 履歴を取得

gmail のログを R を使って集計したかったのでググったら CRAN にパッケージありました、{gmailr} 。

これを使ったコードが簡単なので以下貼り付けちゃいます。 送信したメール一覧を取得します。gmailkey.jsonGoogle Developers Console から取得してください。

library(gmailr)
library(purrr)

# Authenticate Gmail access

gmail_auth("gmailkey.json", scope = 'read_only')

# Create gmail seach query

start_date = Sys.Date()-7 # a week ago
end_date = Sys.Date()

gmail_search_query = paste0("in:sent after:", start_date, "before:", end_date)

# Retrieve message id's using the search query

ids = id(messages(search = gmail_search_query))

# Get the "To" field using the id's

ids %>% map(message) -> msgs
msgs %>% map(to) -> tos
msgs %>% map(cc.gmail_message) -> ccs
msgs %>% map(subject) -> sbjs

以下のレポジトリに置いてあります。

github.com

{purrr} も便利すぎて感動モノだったのですが、それはまた今度。

文字列の結合

エクセルでよく考える文字列の結合について

欲しい出力は

総額 ¥5,000

だけなのですが

文字列結合は CONCATENATE……金額のカンマ区切りは…… とか悩んでたら、CONCATENATE とか特に使わなくて解決するのね。

="総額 "&TEXT(D4,"¥#,##0")

参考: クリエのちょこテク » 文字列&金額 または 日付の見た目を設定したいときに (TEXT 関数)

JavaScript / GAS で日付操作

GAS で Gmail を操作続行中。 一日ごとのメールを取得したかったので、ある範囲(6月〜11月)の日付をなめる for 文を。 SpreadSheet に出力することを想定しているので、col に曜日をとり、1週間ごとに row をインクリメントしている。

  date = new Date(2015, 5, 1); //6 月なことに注意
  
  while(date.getMonth() < 11){
    col = date.getDay()+1;
    date.setDate(date.getDate()+1);
    sheet.getRange(row, col).setValue(date);
    if(col==7){ row++; }
  }

SpreadSheet で Gmail データ取得

参考サイト Gmailのデータを取得する。 - mirandora.commirandora.com

まだよく理解してないが直近のメールの送受信者、件名などが取得できる。

sleep の働きは不明。thread の仕組みも不明

GAS エディタ久しぶりに使ったが想像以上に補完機能が優秀。あとフォントが好き
Google Fonts Inconsolata

function getMail() {
  var sheet =   SpreadsheetApp.getActiveSheet()
  var threads = GmailApp.getInboxThreads(0, 30);
  var row =1;
  
  for (var n in threads){
    var thd = threads[n];
    var msgs = thd.getMessages();
    for (m in msgs){
      var msg = msgs[m];
      var from = msg.getFrom();
      var to = msg.getTo() + msg.getCc();
      var date = msg.getDate();
      var title = msg.getSubject();
      sheet.getRange(row, 1).setValue(date);
      sheet.getRange(row, 2).setValue(from);
      sheet.getRange(row, 3).setValue(to);
      //sheet.getRange(row, 4).setValue(title);
      row++;
    }
    Utilities.sleep(1000);
  }
}