自習用」カテゴリーアーカイブ

[GAS]Googleフォームの解答欄にあらかじめ答えを入れておく

アンケート調査や申し込み手続きで回答を入力してもらうのに、Googleフォームは非常に有用だ。スプレッドシートに回答を転写してくれるので、入力された値を集計したり、入力値をもとに何かスクリプトを走らせることもできる。スプレッドシートのGASには、わざわざフォームから送信されたとき用のトリガが用意されている。

フォームを利用者の入力インターフェースにして、スプレッドシートのデータを使って条件分岐したいときに、予め一部の回答が入力された状態のフォームに利用者を誘導したい。

実はけっこう簡単にできる。フォームの回答画面はURLの最後がviewformになっているので、この後ろに?で
解答欄のID=予め入力したい回答
をつけてやればよい。
解答欄のIDを確認する簡単な方法は、Chromeでフォームの回答画面を表示(プレビューでいい)して、解答欄のIDを確認したいテキストボックスなどを右クリックする。次いで検証を押すと画面右側にカラムが表示される。ハイライトされている部分からnameを探す。一般のテキストボックスだとname=”entry.数値”となっている。この “entry.数値” が解答欄のIDである。
nameが描いてある場所がわからない場合は、検証のカラムでCtrl + Fを押してentry.を検索することを勧める。inputタグの中に入っているので、<inputで始まるのも目印になる。

(フォームのURL)/viewform?entry.1234=hoge
というアドレスにアクセスすると、解答欄のIDが entry.1234 である場所に予めhogeと書かれた状態で始まる。
複数の解答欄に予め回答を入れておくには&でつないでいけばいい。
(フォームのURL)/viewform?entry.1234=hoge&entry.5678=fuga

アドレスを加工すればフォームの初期値を指定できることを応用すれば、スプレッドシートのHYPERLINK関数を使って、初期値を入れたフォームへのリンクを張れる。
スプレッドシートの文字列を結合するとき&を使うことを思い出せば、A1セルの値がhogeである場合、ほかのセルに以下のように入力すれば、上で述べた例と同じくnameがentry.1234である解答欄に回答hogeを初期値として設定できる。
=HYPERLINK(” (フォームのURL)/viewform?entry.1234= “&A1,”スプレッドシートに表示される文字列”)
さらに、A2セルにfugaという文字列が入っている場合、上で述べた複数の解答欄に予め回答を入れておく場合を次のように表現することができる。
=HYPERLINK(” (フォームのURL)/viewform?entry.1234= “&A1&”&entry.5678=”&A2,”スプレッドシートに表示される文字列”)

参考
GOOGLEフォームの初期値

これもFormのGASで設定できないものだろうか。

[GAS] GASでセルを結合した表をドキュメントに挿入する

Google Apps Scriptはスプレッドシートだけでなく、ドライブ、ドキュメントなどほかのG Suiteでも使える。スプレッドシートにまとめた情報をもとに、ドキュメントで報告書を自動生成することも可能だ。

これまで手作業で作成していた報告書をGASで作成するにあたって、2つ手の込んだことを求められた。ひとつには、セルを結合して少々複雑な形をした表をつくることだった。ふたつには、単なるテキストではなく、上付きや下付き、斜体といった書式設定を伴う形で表に文書を書き込むことだった。

ひとつ目の「セルを結合した表」は少々厄介であった。GASのリファレンスを読んでみても、セルの結合に相当するMethodがないのだ。試しにドキュメントでセルの結合をした表を作ってGASで読み込んでみると、セルを結合してできたセルは、TableCell.getColSpan()の値が1より大きい値になっていた。しかし、setColSpan()というMethodは存在しない。merge()も期待したような動作をしないドキュメントではなくHTMLファイルとして出力することはできそうだが、いまはドキュメントを書き換えたいので不適当だ。
結局のところ、あるドキュメントファイルにあらかじめセルを結合した表を用意しておいて、新しいドキュメントにコピーするという手法をとることにした。TableRowのレベルで挿入していけば、下の図のような2行を単位とした繰り返し構造の表がつくれる。

GASでセル結合した表を挿入する例

ふたつ目の書式を維持した文書を挿入するのは簡単である。上で挿入した表のセルに対して、転写したい文書のParagraphをappendしてやればよい。

次に示す例では、元になるドキュメントファイルの1行目 (getCHild(0) またはpp[0] )から5行目(getCHild(4)またはpp[4])に書式をいじった文書が入っている。これを段落ごとに読みだしている。また、7行目( getCHild(6))にはテンプレートにしたい表がある。
appendParagraphする文書をどこのドキュメントファイルに置いておくか、スプレッドシートにでもまとめておけば、表の繰り返し単位ごとに適切なドキュメントファイルを読みだして、表の各セルを埋めることができる。
appedTableやappendParagraphをする際には、copy()を付けてやる必要がある。また、 appendParagraphをする際には、 .merge()をつけないと、余分な改行がセル内に残る。

function tryTable(){
  var doc_from = DocumentApp.openById('元になるドキュメントファイルのID'),
  doc_to = DocumentApp.openById('書き込み先になるドキュメントファイルのID'),
  pp = doc_from.getBody().getParagraphs();

  var body = doc_to.getBody();
  //表をつくる
  var table0 = body.appendTable(doc_from.getBody().getChild(6).copy());
  table0.getRow(0).getCell(0).clear().appendParagraph(pp[0].copy()).merge();
  table0.getRow(0).getCell(1).clear().appendParagraph(pp[1].copy()).merge();
  table0.getRow(0).getCell(2).clear().appendParagraph(pp[2].copy()).merge();
  table0.getRow(0).getCell(3).clear().appendParagraph(pp[3].copy()).merge();
  table0.getRow(1).getCell(0).clear().appendParagraph(pp[4].copy()).merge();

  //表のテンプレートを下に伸ばす。例として10回繰り返し。
  for (var i = 0; i < 10; i++) {
    table0.appendTableRow(table0.getRow(0).copy());  
    table0.appendTableRow(table0.getRow(1).copy());
  }
}

参考
【Microsoft Office 英語】日本語/英語の対照表(Excel, Word)


さらに複雑な表を扱う方法を考える。異なるRowのセルを結合したセルではどのようになるだろうか?次の図に2行5列の表のセルを結合した表と、各セルにアクセスする際に使うRowやCellの番地を示した。複雑な形状に結合した表であっても、結合したセルの左上に位置するセルの値が表示されると見なせるようだ。

行(Row)が異なるセルを結合した表の例

自分で作成した表の各セルにアクセスする番地を確認したければ、getChild(index)で各セルの値を読み出すのが簡単だろう。BODY>TABLE>TABLE ROW>TABLE CELL>PARAGRAPH>TEXTという順序で各オブジェクトがぶら下がっている。TABLE CELLまで行けばgetText()でセルの中のテキストを表示できる。また、各要素にぶら下がっている要素の数はgetNumChildren()で取得できるので、あとはforループで読みだせばよい。

ところで、セルを結合すると表示されないセルが出てくるが、ファイルから消えているわけではないようだ。BODYに対してgetParagraphs() をすると、上の図で表示されていないTABLE CELL (R1C0やR1C2~4)に対応するはずのParagraphも取得される。
BODYに直接ぶら下がっている要素だけを取り出したいときは、BODYに対して getChild() とgetNumChildren()を使うのがよさそうだ。

[GAS] GASで送信したメールのリンクを踏むと受領確認できる仕組み

Google Apps Script (GAS)を使って、文書ファイルを指定のメールアドレスに送信する。文書ファイルの内容を確認した旨を自動で取得するため、送信されるメールにはGASへのリンクを張っておき、ワンクリックで受領確認の記録が残るようにする。このとき、文書ファイルのファイルID、受信者のアドレス、受領確認日時が記録されるようにする。

STEP1 承認用のリンクを踏んだ時に動くdoGET関数を定義

承認用のリンクをつくるには、まずdoGET関数を含むプロジェクトを定義し、ウェブアプリケーションとして導入する必要がある。ウェブアプリケーションとして導入するには、doGET関数を定義したのちに、スクリプトエディタのメニュー「公開」から「 ウェブアプリケーションとして導入 」を選択する。作業が完了すると、ウェブアプリケーションにアクセスするためのURLが発行される。

下にスクリプトの例を示す。
URLの最後尾にパラメータとして、スプレッドシートの何行目に承認済みの記録を記入するか (8行目 row)と承認者名 (9行目 SV)を入れるようにする。
12行目はスプレッドシートへの書き込みの例である。8行目で求めたrow行のA列からC列に対して、”recipt”という文字列, rowの中身, supervisor中身を記入する。冒頭で述べた、文書ファイルのファイルID、受信者のアドレス、受領確認日時あたりはここを書き換えればいい。
16,17行目で送信するメール本文を作成する。16行目はプレーンテキストの場合、17行目はHTMLテキストの場合である。受信者の環境によって、いずれかが表示される。
19行目でメールを送信する。送信者は、このスクリプトを実行するアカウントである。宛先はrecipient、メールタイトルはsubject、本文は前述のとおりである。
21行目以降は、ウェブアプリケーションとして導入したURLにアクセスした人に表示される画面を示している。
※「ウェブアプリケーションとして導入」したあとにdoGETの中身を変更した場合は、再度 「ウェブアプリケーションとして導入」 を行う。このときProject VersionをNewにしてから「更新」すること。

//ウェブアプリケーションとして導入する
function doGet(e) {
  var recipient = "受信者のメールアドレス",
      SS_id = "情報を記録するスプレッドシートのファイルID",
      SheetName = "情報を記録するスプレッドシートのシート名",
      Sheet = SpreadsheetApp.openById(SS_id).getSheetByName(SheetName),
      data = Sheet.getDataRange().getValues(),
      row = e.parameter.row,
      supervisor = e.parameter.SV;

  //ファイルに書き込み
  Sheet.getRange(row,1,1,3).setValues([["recipt",row, supervisor]]);

  var subject = '回覧通知';
  
  var plaintxt = "上長の承認が得られたので、報告書を回覧します。";
  var html = '<h1>報告書の回覧通知</h1>'+ '<p>上長の承認が得られたので、報告書を回覧します。</p>';
    
  GmailApp.sendEmail(recipient, subject, plaintxt, { htmlBody: html });

  var display = '<p>報告書の承認を受けつけました。N氏に回覧します。ご協力ありがとうございました。</p>';
  return HtmlService.createHtmlOutput(display);
}

STEP2 承認リンクのURLにパラメータを付加してメールで送信する

STEP1で作成したウェブアプリケーションのURLに、スプレッドシートの情報を読みだしてパラメータを付加させる。

下にスクリプトの例を示す。
7行目のsupervisorを承認依頼メールの受信者にする。data[0][2]すなわちシートのC1セルに入っている値を読みだしている。8,9行目も同様にスプレッドシートのB1セル、A1セルの値を読み込んでいる。
11,12行目で、ウェブアプリケーションにアクセスするURLに、パラメータとしてrowとSVを付加している。パラメータSVならdoGET関数でe.parameter.SVとして受け渡される。複数のパラメータは&で結ぶ。※下のスクリプトでは&amp;となっているが、amp;は除く。
14,15行目はメールに本文を生成している。
17行目は添付したいファイルを呼び出している。ファイルはあらかじめGoogle Driveに入れておく。ファイルIDの調べ方
あとはメールでsupervisorに送る。

//承認依頼のメールを送信する
function myFunction() {
  var SS_id = "情報が記録されているスプレッドシートのファイルID",
      SheetName = "情報が記録されているスプレッドシートのシート名",
      Sheet = SpreadsheetApp.openById(SS_id).getSheetByName(SheetName),
      data = Sheet.getDataRange().getValues(),
      supervisor = data[0][2],
      subject = data[0][1],
      row = data[0][0];
      
  var url = "ウェブアプリケーションのURL(execで終わる)";
      url += '?row=' + row + '&SV=' + supervisor;

  var txt = '承認リンク ' + url;
  var html = '<h1>次のリンクを開いてください</h1>' + '<a href="' + url + '">承認</a>';
 
  var file = DriveApp.getFileById("Google Drive上のファイルのID")
    
    //承認依頼メールを送信する
    GmailApp.sendEmail(supervisor, subject, txt, { htmlBody: html, attachments: file});
}

参考
「Google Apps Script」で社内システムをつくってみた~GASとの出会い編~
GASのワークフローでURLのパラメータで承認・否認を切り替える方法

企業の研究開発における技術伝承のありかた

想定読者 製造業の研究開発に携わる研究者

日本の製造業がかつて世界を席巻したというのは本当の話だろうか。そうだとしたら、日本の製造業の研究開発のレベルはかつてより低下してしまったのではないか。

民間企業の研究所は競合に打ち勝ち利益を上げられるような優れた新商品、新技術を生み出すための専門家集団だ。専門分野ごとに様々な研究者がいて、広範な領域の高度な技術を統合してひとつの素晴らしい商品を生み出す。研究者たちには日々の実験作業を支える助手がいて、研究者は技術の高度化と課題解決に集中する。助手たちは実験作業の手技レベルを向上させることで職人技ともいうべき繊細な実験を行い、新発見の端緒をひらく。そんな研究所を維持できている企業が、いまどれだけあるだろうか。

平成の30年間に人が減った。助手たちは事務系の一般職と同じように派遣労働者に転換された。わずか数年で職場を去る派遣労働者に技術を教えて、信頼できるまでに育ったころにはさようなら。これで職場から職人技が消えた。いわずもがな研究者も減らされた。論文ほど詳細に手順が記されているわけではない社内報告書を読んだところで失われた技術を復元できるわけではない。人がいないのだから、かつては助手がやっくれていた作業も研究者がやるようになった。グローバルな競争のおかげで商品開発の現場に対する要求が弱くなることはないというのに、研究者が商品開発に集中できる環境は減らされている。

日本の人口が減り続けるのだから、かつてのように人的資源が豊富に手に入ることは今後ない。そうであるならば、効率的に技術が伝承され、知見が共有されるシステムを構築して、現役の研究者たちが浪費している時間と費用を削減するほかない。働き方改革をお題目では済まされない。


これまでの技術伝承や知見の共有が効率的でなかったのは、形式知化されていなかった点が大きい。何かあれば詳しい研究者本人に聞きに行けばいい。報告書は成果を上層部にアピールすために書く。詳細な部分は書いてもアピールにならない。自分の暗黙知を文章に起こす時間があれば、その時間を次の商品開発に使った方が効率的だ。人ひとりが持てる知識や技術の量が有限だったとしても、人がたくさんいれば解決する。このような状況で人減らしを行えば、職場を去った人の数だけ技術が失われるのも当然だ。

先人たちの考え方にも一理あるが、暗黙知を形式知に転換するのに要する労力が馬鹿にならない。伝える相手のレベルがわからなければ、どこまで書きおこせばいいいのかわからない。大学で使うような教科書をつくれというのだろか。そんなことはできない。
ここで私が提案したいのは、かつて自分がいまの職場に来たときを思い出し、新人の自分に対して教えるように書くことだ。そこで暗黙の了解とできることであれば、他者が新人の立場でも同じような事柄をすでに身につけているとみなせるだろう。さらに、自分の次の新人が共有できない前提があったとしも自分はそれを説明できるはずだ。そうやって新しい人が来るたびに情報を追加していけば、たいていの人に伝わる内容になるだろう。

書く内容のレベルが決まったとしても、書くべき内容は膨大にあるように思われる。ここで気持ちを萎えさせずに思い出してほしい。自分ですべて書く必要はないことを。他者の文章を剽窃しろというわけではなく、他者の文章を読んで済むなら引用するなり参照するなりすればいい。学部生が勉強するような内容は教科書を読めばいい。ただ、どの教科書を読めばいいのか、何という名前の概念を理解すればいいのかは書いておこう。学ぶ必要はあるが、迷う必要はない。

忙しい中でまとめた資料が使われずに忘れらていくとしたら、そもそもそんな資料を作るべきでなはない。普段の業務を効率化するチートシートや、自習用の資料のような立ち位置で同僚に利用してもらえるような内容を盛り込んでいこう。

最も重要な点は、利用者に資料を改善させられるようにしておくことだ。利用者が不足していると感じた情報をすぐに追加できるようにしておく。内容に誤りがあれば修正できるようにしておく。ここまでくれば、もはや個人のみならずチーム全体の知恵袋として価値を発揮しはじめる。

これが私の考える「暗黙知を形式知へ転換する」ということ。Wikipediaの社内版というイメージがわかりやすいだろう。

windowsでpythonを使いたい

Pythonのインストール

ライブラリのインストール pandasとか

開発環境の整備atomのインストールと パッケージの導入

グラフなど画像や計算結果を表示しんがら実行したいときはjupyterが便利。.ipynb形式を読んだり。atomやVS Codeなどのエディタでもプライグインで対応可能。
Atom と Hydrogen で Jupyter が Atom で動くよ!(インストール、準備、使い方まで)

2次元相関分光の例2Dshige

Google Apps Script を使ったかんたんリマインダーの作成

ユーザーのリテラシーが高くない環境でG Suiteを使いこなすことを考えている。Gmailにはアドオンで予約送信機能を付けることができるが、アドオンの利用も難しいレベルを想定している。

Google スプレッドシートはExcelとほぼ同じように使えるので、あまりPCの扱いが得意でない方でも直感的に利用できる。そこで、スプレッドシートにGoogle Apps Script (GAS) で手を加えることで、だれでも簡単に指定したタイミングでメールを送ることができる仕組みを作成した。

まず、インターフェイスであるスプレッドシートのファイルを作成した。以下の図に示すように、ABC列を送信条件、DEF列を送信するメールの中身とした。入力のやり方が直感的にわからない方のために、3行目に入力例を用意した。
宛先にはカンマで区切ることで複数アドレスを入れられることや、メール本文のセルでセル内改行をするとメール本文でも改行されることなどを明記した。

Google スプレッドシートの画面作例

メール送信タイミングの条件は、データの入力規則で予め入力できる値を制限しておくとよい。作成者が意図しない入力を防げるし、表計算ソフトになれていないとキーワードで値を入力させるよりマウスで選択肢から入力する方が安心する場合がある。
また、余計な空白があると、使用者が意図しない入力をしたり、混乱したりする懸念があるので、G列から右は削除した。

ツール>スクリプトエディタから以下のコードを貼り付ければ、一応動作するものがつくれるはず。時間主導型トリガーで「1時間ごと」に実行するような条件に設定しておけば、条件と合う時刻にGASが作動し、メールを送ってくれる。

function reminder() {
  //スプレッドシートのデータを取得
  var sheet = SpreadsheetApp.getActive().getSheetByName('reminder');
  //dataにはシートreminderのデータが2次元配列で格納される
  var data = sheet.getDataRange().getValues();
  //データ入っている最終列を取得
  var lastrow = sheet.getLastRow();
  
  //トリガー起動時の日付、曜日、時刻を取得
  //現在の年月日時刻を求める
  var date = new Date();
  //日付のみ分取
  var date_now = date.getDate();
  //曜日のみ分取 値は0~6 (日曜日~土曜日)
  var day_now = date.getDay();
  //時のみ分取
  var time_now = date.getHours();
  
  //曜日を数値から文字に変換
  var dayNames = ['日','月','火','水','木','金','土'];
  var day_now_name = dayNames[day_now];
  
  //スプレッドシートの上から最後の行まで繰り返し
  //配列のインデックスは0から始まることに注意。スプレッドシートの3行目を入力例にしてので、4行目 i = 3 からスタート。
  for (var i = 3; i<lastrow; i++){
  
  //送信条件を格納
  //日付
  var date_to_send = data[i][0];
  //曜日
  var day_to_send = data[i][1];
  //時間帯
  var time_to_send = data[i][2];
  
  //送信条件判定
  //日付判定 日付条件指定なしの場合は毎日実行するようにした
  if (date_now == date_to_send){
    var flag_date = true;
  }else if (date_now =='指定なし') {
    var flag_date = true;
  }else{
    var flag_date = false;
  }

  //曜日判定
  if (day_now == day_to_send){
    var flag_day = true;
  }else{
    var flag_day = false;
  }
  
  //時間帯判定
  if (time_now == time_to_send){
    var flag_time = true;
  }else{
    var flag_time = false;
  }
  
  //メール送信条件判定 すべてのflagがtrueならメールを送信する
  if (flag_date && flag_day && flag_time){
  //送信内容取得
  var sendto = data[i][3];
  var title = data[i][4];
  var message = data[i][5];
  
  //メール送信
  MailApp.sendEmail(
    sendto,  //メール宛先
    title,   //メール件名
    message, //メール本文
    {
      name: 'かんたんリマインダー'   //差出人の名前
    }
  );
  }
  
  //繰り返し単位終わり
  }
}

関連項目 GoogleフォームとGASでつくる同報メール送信システム

電池性能の指標 面抵抗

騒がれている割に市場に出てこない全固体電池。ブレイクスルーっぽさを感じるニュースが定期的に出てくるけれど、その発見にはどのような価値があるのか。

最近、次のようなニュースが流れてきた。いわく、電極と固体電解質の界面で大きな抵抗が生じるのが問題だったが、界面抵抗を低減する方法を見つけたという。

東京工業大学物質理工学院の一杉太郎教授、日本工業大学の白木將教授および、産業技術総合研究所(産総研)物質計測標準研究部門の白澤徹郎主任研究員らによる研究グループは2018年11月、界面抵抗が極めて小さい高性能な全固体電池を実現するためには、界面における原子配列が、規則的であることがポイントになることを発見したと発表した。


全固体電池、界面の規則的原子配列が高性能の鍵
eetims 2018年11月27日

ここで見慣れない単位を見かけた。界面抵抗Ωcm2である。調べてみつと、界面での電位降下[V]を電流密度 [A/cm2]で割った単位だった。中学校の理科で勉強する電気抵抗Ωは、回路の大きさを考えていない。実際には、回路の電線が太くすれば電気抵抗は小さくなる。これは単位面積あたりに流れる電流が小さくなるためと考えればよい。すると、材料として電気を通しやすいか否かは電流が流れる面積を揃えてあげないと、公平な比較ができない。このため、単位面積で比較する界面抵抗という単位が用いられる。

界面抵抗を使った簡単な計算をしてみよう。たとえば、以下のような問題を考えてみる。

急速充電時の発熱を見積もるには、電極面積の値が必要である。接触抵抗率[Ω cm2] = 電圧 [V] / 電流密度 [A/cm2]をもとに、日産リーフの電池をモデルに考えてみよう。まず電池パックが2並列であることから、CHAdeMO規格50 kWの充電電流120 [A]は2並列に分かれるのでひとつのセル、電極には60 [A]が流れる。
電極面積はシート形状(261 mm×216 mm)からおよそ500 [cm2]と見積もれるので、電流密度は0.12 [A/cm2]と求まる。
接触抵抗率 5.5 [Ω cm2 = V / (A /cm2)] であれば、界面の電圧が0.66 [V]になるので、界面全体での消費電力は60 [A] * 0.66 [V] ~ 約40 [W]になる。ちなみに、40 [W]というと、オフィスの直管型蛍光灯1本の消費電力と同程度である。

ところで、60 [A]での充電というのは、どれほど電池にとって厳しいことをしているのだろうか。電池容量が1 [Ah]のものと1000 [Ah]のものがあったら、同じ60 [A]という電流値であっても電池にとってのキツさは異なる。そこで、所定の時間で完全に充放電できる電流値を比較の物差しにする。先ほどと同じく2018年現在のリーフの電池をモデルに考えてみよう。定格容量56.3 [Ah]なので、60 [A]なら約1時間で充放電される。1時間で完全に充放電される電流値が1Cといわれる値であり、電池容量に電流の大きさとしては普通の値である。この2倍、3倍、5倍、10倍というような電流値になると、電池にとって厳しいハイレート充電・放電という言われ方をする。

電池パック全体では300 [A]のような大電流で充電したとしても、並列回路で電流を分けたり、広い面積の電極をつかったりすれば、それほど高い電流密度になるわけではない。一方で、電池の大きさはできる限り小さくしたいという要望があるので、このバランスとして車載電池のスペックが決定される。

必要なサンプルサイズの求め方

測定には不確かさが付きまとう。n回測定したデータを平均して、実験値とするのが一般的である。n回とは具体的に何回測定したらいいのかを見積もりたい。

n回の測定値を単純平均して得られた値をAverage (ExcelでAVERAGE)、不偏標準偏差をSD (ExcelでSTDEV) とすると、標準不確かさは SD/sqrt(n) で求めることができる。したがって、実験値の求め方としては Average ± SD/sqrt(n) となる。

不確かさを持った値を用いて、何かしらの理論式に代入するなどの計算を行う場合は、不確かさの伝搬を考える必要がある。具体的な計算は東北大多元研のページを見ると便利。

実験値が求まったら、次は実験値の不確かさを目標以下に小さくすること考えたい。母平均の区間推定における必要なサンプルサイズの計算フォームを参考にすると、平均値μから±δの区間にあることを有意水準5%で示すのに必要なサンプルサイズnは

n > (1.96 * (STDEV/δ))^2

物理ではa±bという実験値に説明がなければ、通常bは「1シグマ」である。有意水準5%というと95%信頼区間を求めていることになるが、1シグマだと68%信頼区間を求めることになる。

n > (1.0 * (STDEV/δ))^2 = (STDEV/δ)^2

 

統計やるのは久しぶりすぎて理解してないので、要復習。サンプルサイズの決め方自然科学の統計学あたりを見てみるとしっかり学べそう。

そもそも実験誤差って何?というレベルの人には誤差の理論(東京医科歯科大)を見せるのが楽そう。

なお、雰囲気で統計をやっている人のお約束として、サンプルサイズ (標本の大きさ) とサンプル数 (標本数) を混同するというのがある。使いやすい踏絵である。

日付の加算減算 (VBA)

毎月更新する帳簿に使用期間を自動で記入するプログラムを作成することを考えた。エクセルのVBAでは日付をDateで取得できる。さらに、年、月、日、時、分、秒のどの部分を取り出したいかはFormatで選択できる。たとえば Format(Date, “yyyy.mm”) とすれば、現在の年月が取得できる。

今月の21日から来月の20日までという表示をしたい場合はどうすればよいか。今月の21日は文字列の結合を使って  Format(Date, “yyyy.mm”) & “.21″と書ける。それでは、来月の20日はどうするか。単純に数を加算する式 Format(Date, “yyyy.mm”) + 0.01 & “.20” を書いてみるとそれっぽく動作するが、繰り上がりが起きる9月から10月や、12月から1月がうまく動作しない。
ここで安易に場合分けをして書いてはいけない。DateAdd関数を使えば、日付や時刻の計算は簡単にできる。使用例はDateAdd VBAで検索すればたくさん出てくる。加算する値を負にすれば減算にもなるので、前の月や前の年といった過去の日時も取得できる。

例: 先月21日から今月の20日
Dim date_previous As Date
Dim date_now As Date

date_previous = DateAdd("m", -1, Now)
date_now = Date

Sheets("hoge").Cells(1, 1).Value = Format(date_previous, "yyyy.mm") & ".21~" & Format(date_now, "yyyy.mm") & ".20"

化学系のための覚えておきたいExcel操作

夜更けまでマイクロピペットを振り回す実験第一主義の化学者にもデータ処理の時間はやってきます。データ処理に使うソフトはきっとエクセル。それなのに、エクセルの使い方を調べても会計や在庫管理の話ばかり。それもそのはず、ほとんどのユーザーはビジネスに使っているのだから。

ワード、エクセル、パワーポイントが理系大学生のマストアイテムになっているにも関わらず、使い方を教わる機会はほとんどありません。大学の授業に演習があるか、配属された研究室の先輩や先生に教わるか。化学系の人は情報系に疎い場合もあり、知っていれば便利な機能を知らずに気合でどうにかしてもらうことも。それじゃあ悲しいので、私が研究に使う機能をまとめようと思います。

エクセル編

書いてあることがよくわからなかったら、まずは書いてある通りに手を動かしてみよう。使っているうちにわかる。

・キー操作、ショートカット

マウスでの操作は簡単で直感的だが、いちいちメニューを何回もクリックしたり、興味があるセルにカーソルを移動させるために机の上で腕を大きく動かさないといけない。これに対して、キー操作なら曖昧さのない操作をほとんど腕を動かさずにできる。エクセルを仕事で使うなら、キー操作に慣れるべきである。

一般に、xx + yyという表現を、xxキーとyyキーを同時に押すという意味で用いる。なお、Ctrl, Shift, Altキーについては押す順番を問わないので、順番に押していけばよい。文字のキーは、Ctrlキーなどを押した後に押すこと。

Ctrl + F

検索と置換ボックスの検索タブを開く。検索ボックスに語句を入力すれば、シート全体から一致する箇所をピックアップしてくれる。
コンピュータ上のデータはコンピュータに探させればいい。目で追っていくのは愚かだ。このページの文章についても、検索をつかって効率的に欲しい情報を見つけてほしい。

Ctrl + HまたはCtrl + F > 置換

検索と置換ボックスの置換タブを開く。
ある語句をある語句で置き換えたいとき、セルをひとつずつ探しているのは効率が悪い。置換タブで検索語と置換語を指定すれば、自動で置き換えられる。
「すべて置換」を押すと条件に合う検索語はすべて置換される。検索でひっかかったセルを確認しながら置換を行いたいときは、置換していい場合に「置換」置換したくない場合に「次を検索」を押せばいい。

Enter

下隣のセルに移動する。
Shift + Enterなら上隣のセルに移動する。

Tab

右隣のセルに移動する。
Tabを押して移動したセルに値を入力し、さらにTabを押して右隣に移動することができる。この状態でEnterを押すと、最初にTabキーで移動し始めたセルの下隣りのセルに移動する。
ノートの手書きの数字をエクセルに入力する際に便利。
Shift + Tabなら左隣のセルに移動する。

PageUp, PageDwon

画面1ページ分だけ上または下に移動する。
長い配列のデータを見ながら移動したいときに画面の移動の仕方が見やすい。

Ctrl + 矢印キー

もともと選択されていたセルの隣が空欄なら、矢印方向の値が入っているセルに飛ぶ。
もともと選択されていたセルの隣が空欄でないなら、矢印方向の値が入っている連続した配列の最後に飛ぶ。

Shift + 矢印キー

選択されていたセルから、矢印方向に選択範囲が広がる。複数のセルを選択したいときに使う。
マウスで選ぶのよりも早くて正確。

Ctrl + Shift + 矢印キー

選択したセルから連続する値が入った領域の最後まですべて選択する。
マウスで選ぶのよりも早くて正確。

Ctrl + A

全選択。値が入っているセルを選択している場合、連続する値が入っている領域をすべて選択する。一見Ctrl + Shift + 矢印キーより便利そうだが、サンプル名やデータラベルなどの文字列もすべて選択するので、装置が出したファイルの配列のうち、一部のみを選択したいときには少し使いづらい。
なんでもいいから全部選択したいときはとても便利。

応用例: スペクトルデータの全選択

スペクトルの測定データはたいてい数値が一列に並んだデータ形式になっている。
装置が吐き出したcsvなどのファイルをデータ処理用のエクセルファイルにコピペすることを考える。
スペクトルの先頭のセルを選択して、Ctrl + Shift + 下矢印キーでまず列方向のデータを全選択する。さらにCtrlを押し続けたまま、Ctrl + Shift + 右矢印キーで選択範囲を複数列に広げる。
複数列のデータを選択するのに、マウスで列のラベル(A列、B列と書かれているところ)を押せばいいのだけれど、列選択は列を丸ごとコピーするときにしか使えない。コピー先のシートの先頭行にサンプル名を入れたりするとコピペできないというトラブルにつながる。したがって、必要なセルだけを選択するこの方法が良い。

Ctrl + C

選択したセルをコピーする。最も有名なショートカットかもしれない。このとき、セルの値だけでなく、セルの色や枠といった書式についてもコピーされていることに注意する。

Ctrl + V

コピーしたものをペーストする。コピー元のセルが数式だったり、色や枠付だったりすると、丸ごとペーストされる。数式がコピーされることを認識していないと、相対参照がズレてエラーになることがある。
エクセル以外からコピーすることもできる。数値、文字列、なんでもござれ。

Ctrl + Alt + V

コピーしたものを、形式を選択してペーストする。値だけ、数式だけ、書式だけといったコピペが可能なので、意外と重宝する。
特に、値だけコピペはよく使うことになるだろう。たとえば、Googleで「ボルツマン定数」を検索すると、文字サイズの書式情報が付いた数値が表示される。そのままコピペすると大きな文字がセルに入るので、「テキストとして貼り付け」を行う。まあ、このときは「=」を入力したあとにCtrl + Vでもいいのだけれど。
他には、別のシートで計算した結果の値だけを入力したいとき、他人に見せるために色や枠を丁寧に設定した表を作るときにも使える。

F4

相対参照と絶対参照を入れ替える。F4を押すたびに、行列両方絶対参照、行だけ絶対参照、列だけ絶対参照、行列両方相対参照と変わる。
エクセルでセルに数式をつくったとき、どこのセルの値を参照するかは相対位置で決まっている。これを相対参照といい、セルの中には「=C3」のように記入されている。一方で、計算に使う定数のように、とあると値を複数のセルから同じように参照したいときがある。このときは数式をコピペしても、セル番地が変わらないような参照方法である絶対参照を用いる。絶対参照をするには、固定したい行または列に$マークをつける。A1セルに絶対参照したければ、「=$A$1」と入力する。これをいちいちセルをクリックして文字列を修正するのは面倒なので、F4キーを押してやればいい。

応用例: モル吸光係数の算出

モル吸光係数は、光路長1 cmの吸光度をモル濃度で割ることで求められる。吸収スペクトルのデータからモル吸光スペクトルのデータを算出するには、「=[吸光度のセル]/[モル濃度のセル]」とセルに入力すればよい。
ここで、試料のモル濃度をB1セル、試料の吸光度がB2セルからB100セルに入っている場合を考えよう。まず、C2セルに「=B2/$B$1」と入力する。C2セルを選択した状態でセル右下の黒四角をダブルクリックして、オートフィル機能を使う。すると、C2セルに入力した数式と同じような数式が自動で入力され、C2からC100セルにモル吸光係数のスペクトルが計算される。
さらに、複数の試料のデータがある場合を考えよう。サンプルXのモル濃度がB1セル、吸光度がB2セルからB100セルに入っており、サンプルYのモル濃度がC1セル、吸光度がC2セルからC100セルに入っているとする。まず、D2セルに「=B2/B$1」と入力する。B$1のBには$がついていないので、行は絶対参照で列は相対参照になっている。D2セルをコピーしてE2セルにペーストすると「=C2/C$1」になる。D2セルとE2セルを選択した状態で、オートフィルを使うと、B列からD列へ、C列からD列へ、計算する式ができる。

F6, F7, F8, F9, F10

日本語を打つ時のように全角モードで入力している際に、ファンクションキーを押すと文字の種類を変えられる。
F6はひらがな、F7はカタカナ、F8は半角カタカナ、F9は全角アルファベット、F10は半角アルファベット。F7とF10はよく使うと思う。会社のルールなどのくだらない理由で半角カナや全角アルファベットの入力強いられた場合は、F8やF9を思い出してほしい。

F1

ヘルプの表示。F1でヘルプは多くのソフトで共通の挙動。
周囲にコンピュータに詳しい人が居ない場合、こんなことができないかな、と思ったら、ヘルプを見るかGoogleで検索すると、案外解決する。

Ctrl + N

新しいまっさらなファイルをつくる。

Ctrl + WまたはAlt + F4

開いているファイルを閉じる。

Ctrl + S

上書き保存。まだ保存されていないファイルは名前を付けて保存ダイアログがでる。
PCがフリーズしてデータが飛ぶと悲しいので、こまめにCtrl + Sで保存する習慣をつけよう。

Ctrl + O

ファイルを開く。
csvをインポートするときに、Ctrl + Oでファイルを開くダイアログを出して、データの入っているフォルダを開いて、Ctrl + Aでまとめて選択して開くと楽かもしれない。

Ctrl + B

太字にする。

Ctrl + I

斜字にする。

・簡単な計算

四則演算

数値セルと数値セルの間で計算式をつくればいいだけ。
セルの先頭に「=」を入力して、そのあとに数式を続ける。
計算記号は演算子と呼ばれる。足し算は「+」、引き算は「-」、掛け算は「*」、割り算は「/」を用いる。

指数、対数

指数の演算子について、べき乗は「^」を用いる。
特に、自然指数関数の場合はexp関数を使い、「=exp()」の()の中に式(引数)を入れる。

対数の場合は、log関数を用いる。
特に、常用の対数のためにLOG10関数、自然対数のためにLN関数がある。

文字列の結合

異なるセル間の文字列を結合した文字列をつくるには、計算の演算子と同じように「&」でセルや文字をつないでやればよい。
たとえば、A1セルに「サンプル」という文字列、A2セルに「1」という数字が入っているときに、「=A1&A2」という式をつくると、「サンプル1」という文字列が出る。数字が自動で文字列になっている。
数式では数字を直接入力できるが、文字列は””で囲んだ部分が文字列として認識される。上の例でいうと、「=A1&”#”&A2」という式にすると、「サンプル#1」という文字列が出る。

応用例 グラフの系列名を実験条件から生成する

文字列の結合を使うと便利なのが、グラフに凡例を表示する場合である。凡例にデータの系列名を表示させるとき、サンプル名や測定条件を系列名にすることが多いだろう。あとからデータ処理をすることを考えると、試料名、試料の作成条件、測定条件、測定番号などを別々の行なり列なりに入れておくべきである。一方で、グラフに表示させる系列名としては、これらの情報をまとめて表示させたいものである。そこで、系列名用にセルを空けておき、そのセルに文字列の結合をつかって試料名などの情報をまとめた文字列を生成するとよい。いったん文字列を結合する式を作ってしまえば、あとはコピペでよいので、たくさんの試料を測定する際にはかえって楽になる。統一されたスタイルで系列名をつくれて、かつ後から修正する際も容易である。

たとえば、系列名のセルに「フルオレセイン 励起波長488 nm」と書かれていたとする。同じ条件でフルオレセインイソチオシアネートを測定した場合は、系列名をコピペした後にセルを選択して、「フルオレセイン」を「フルオレセインイソチオシアネート」に書き換えなければならない。
さらに、あとから「励起波長」を「Ex.」に書き換えたいと思ったら、いちいちセルの中身を書き換えるか、検索と置換ダイアログを使って置換をする必要がある。
ここでもし系列名のセルが「=[試料名のセル]&” 励起波長”&[励起波長のセル]&” nm”」と書かれていれば、セルの式を「=[試料名のセル]&” Ex.”&[励起波長のセル]&” nm”」に書き換えてコピペするだけですべてのサンプルの系列名を容易に修正することができる。

余談だが、文字列の結合は文字列の分解よりもはるかに容易である。姓と名が別のセルに入っているところからフルネームを算出するのは簡単だが、その逆はどこで姓と名が切れるのかコンピュータには判断が難しい。このようなデータ処理の性質を認識したおくと、コンピュータを使って仕事の効率を上げるのに役立つ。

・関数

SUM, PRODUCT

MAX, MIN

Average, STDEV

VLOOKUP

INDEX, MATCH

IF

SUMIF

COUNT, COUNTA

COUNTIF

LINEST 線形回帰の結果、傾きや切片を配列として出力する。切片は0など、回帰の条件を付けられる。

SLOPE 線形回帰の傾きを求める。回帰の条件は付けられない。

INTERSEPT 切片を求める。

・データ分析

・VBA

関連情報

化学工学会 Excelで解く化学工学10大モデル