パソコン・インターネット

ビデオ会議での留意点の共有

この記事は自分用の覚書です。

S.Y さん。

ビデオ会議をやってみて、気がついた点の共有です。

・拠点A(社内)
スピーカーフォン(OfficeCore M1)の周りに7名。それぞれPCの前で着座。
スピーカーフォンは別途1台のPCに接続。

・拠点B(自宅)
PCの前に1人。

・拠点C(店舗)
PCの前に1人

・拠点D(社内)
同じ室内に2人。それぞれPCの前で着座。

Onlinemeeting_20200331092601

留意点

・スピーカーフォンを使う場合、スピーカーフォンだけが音を集めて、音を出している状態にする。
・発言しないときは、マイクをミュートしておく。
・アプリのミュートとミュート解除だけでなく、PCのマイクとスピーカーも確認する。
・同じ室内でいるときは、イヤホンを使う。
・話し方もけっこう大切。

・スピーカーフォンだけが音を集めて、音を出している状態にする。

ビデオ会議をしながら調べ物をしたり、データを共有したりするので、会議に参加している全員がそれぞれの場所でPCの前に着座していました。
拠点AではWebカメラを使っていますが、その他の場所ではPCに内臓のカメラで各自映っていました。

また、拠点Aでは1台のPCにスピーカーフォンをつないでいました。

この場合、拠点Aでは、各自のPCのマイクとスピーカーを「オフ」にしておかないとハウリングします。
Webカメラに内蔵マイクがついていたら、もちろんそれも「オフ」です。

スピーカーフォン以外の機器が音を出していると、それをスピーカーフォンがひろうので。ぐるぐる回ってハウリングの原因になるようです。

・発言しないときは、マイクをミュートしておく。

これは拠点BとCのような場合ですね。
その人がいる周囲の音もPCのマイクはひろいます。それが他の全員のスピーカー(拠点Aでは1台のスピーカーフォンですが)から聞こえるので、そのときに話している人の声を妨げる場合があります。

・アプリのミュート、ミュート解除だけでなく、PCのマイクとスピーカーも確認する。

Zoom や Hangouts Meet でのミュートやミュート解除が、PCのハードウェアと連動しないことが起こりました。理由はわかりません。
「音を切っておく」や「音がでない」といった場合は、PCのマイクとスピーカーもオフやオンになっているかの確認もしたほうがよいと思います。
MacBook なら「システム環境設定」の「サウンド」。Windows なら「コントロールパネル」の「サウンド」です。

・同じ室内でいるときは、イヤホンを使う。

拠点Dではスピーカフォンを使っていません。
約3m×4m ほどの室内に2人いて、それぞれにPCでビデオ会議に参加していました。2人の距離は、間に普通の事務机とその横に袖机が1つあるぐらいでした。

この場合は、互いのPCが音を出さないようにイヤフォンをしておかないとハウリングしました。

マイクは各PCのものを使っていて問題はありませんでしたが、距離が近いので互いが発言する声が気になる人は気になると思います。
そういう場合は、可能なら1人が別の部屋に移動するしかないですね。もちろん、その場合はイヤフォンは不要です。

また、拠点Aでビデオ会議中に各自がPCを使うことが多いのなら、今後はスピーカーフォンをやめて全員がイヤホンとPC内蔵マイクを使った方が、他の拠点での声の聞こえがよいだろうと思いました。

ただし、スピーカーフォンとイヤホンでは、同じ時間の会話でも後者のほうが疲れるという人もいました。
そういうことも考慮すると、やはりスピーカーフォンが正解かなという気もしますね。

・話し方もけっこう大切。

特に拠点Aのような場合ですね。

スピーカーフォンで声をひろっているとき、発言している人の声を相手が聞きやすいやかどうかには、声の出し方もけっこう影響があるようです。

話始めから話終わるまで、同じ声の大きさで話していないと聞きづらいです。

たまに、最初はそれなりの声の音量でも、話の終わりに近づくにつれて小さくなっていて、最後は口のなかでぼそぼそというような話し方をする人がいますが、そういう声の出し方は、とても聞き取りづらくなります。

声が低い人も聞こえづらいです。
声が低い人は、ちょっと意識して高めの声を出すと聞こえやすいようです。

また、そもそも声が小さい人も聞き取りづらいです。
ビデオ会議では、意識して少し大きい声で話すのがよいようです。

特に拠点Aのような場所だと、そこにいっしょにいる人たちに向かって話す話し方をしてしまいがちです。
そういう声の出し方では、その場にいる人たちには聞き取れても、スピーカーフォンより向こうにいる人たちには聞こえづらくなることがあります。

そういうことも意識しながら話すのが大事だなと感じました。

| | コメント (0)

Google Apps Script で複数の人たちに1人ずつメール送信

この記事は自分用の覚書です。

■macOS Catalina
バージョン 10.15.3

■Google Chrome
バージョン 80.0.3987.149

■Gsuite Business

K.Y さん

Google Apps Script で複数人対象に、1人ずつメール送信するやり方です。
Google Apps Script、Googleドキュメント、スプレッドシート、Gmailを使います。

次のようなメール送信ができます。

・複数の人にメールを送信する際、To には1人分のメールアドレスを入れる。
・全員に同じ件名、同じメール本文を送る。
・本文中に相手の氏名を入れる。(その人ごとに変える。)
・From は自分のメールアドレスにして送信する。
・以上を人数分繰り返す。

From をGoogleグループのメールアドレスにもできます。
その場合は、そのグループで認証が必要で、認証のためにはグループの投稿権限で「ウェブ上のすべてのユーザー」も許可されていないといけません。
そのあたりは、Gsuiteの管理者と相談してください。

なお、From をグループのメールアドレスにして送信すると、受信側のシステムやメールソフトによっては迷惑メール扱いになる場合があります。
From を送信者のメールアドレスではないものにしているので、「なりすましメール」ということで。
あと、聞いただけの話なのですが、Outlookで受信すると、「(自分のメールアドレス)が(グループのメールアドレス)として送信しています」というような表示がされるそうです。

そのへんは仕方がないですね。
誰が送ってきたのかを完全に伏せることができるなんて仕組みは、Googleも提供しないでしょうから。

送信前の準備

メールの本文と受信者の一覧をつくっておきます。

メールの本文はGoogleドキュメントでつくってください。

件名は不要です。件名はこのあとスプレッドシートで指定します。
文中でメールの受信者の氏名を入れたいところは、 {お名前} という表記にしておいてください。
お名前 という文字列を半角の { と } で囲みます。これは必須です。

下記のコードでは、HTMLメールは送れません。
字体や文字色など文字に書式を施しても無効になります。
URLは送れます。
メールに署名をつけるなら、いっしょにつくっておいてください。

Gas_mailsousin_honbun

メールの宛先にする人たちの一覧を、スプレッドシートでつくってください。
列の並びは次図の通りにしてください。
コードのなかで各列を決め打ちしているので、列の並びを変えたり、途中に挿入したりしないでください。
1行目の「列見出し」は、使う人がわかればなんでもいいです。

Gas_mailsousin_spreadsheet

ドキュメントのIDとは、メール本文にするドキュメントのURLの /d/ のあとから /edit の前までのことです。
たとえば、https://docs.google.com/document/d/????????????????/edit なら ???????????????? の部分がドキュメントのIDです。

「表示する名前」の列では、受信した際に、相手の手元で自分の名前がどのように表示されるかを指定します。
たとえば、「事務局」と表示したかったらそう入力してください。
先の From の話でふれたように、ここで指定した表示も、受信側のシステムやメールソフトによってはその通りの表示にならないで、送信者の名前が表示される場合があるそうです。

コードについて

冒頭で全ての変数を宣言しているのは、単に私の好みです。深い意味はありません。
(Google Apps Script では、コード中に変数が出てくるときに変数の宣言ができますが。)

「プログラムのコードを書く」という経験を VBA から始めたせいか、最初に変数を宣言しておかないとなんか気持ちが悪くて。
変数 i を真っ先に宣言しているあたりが、「VBA をやっている人だなあ」感があるでしょ?
(JavaScript や Google Apps Script に慣れている人が見ると、こちらのほうが気持ちが悪いのでしょうけど……。)

受信者の一覧をつくったら、同スプレッドシートの「ツール」から「スクリプトエディタ」を選択して、下記のコードを貼り付けてください。
コピーするのは function onOpen から、このページの一番下にある } までです。
Google Apps Scriptのプロジェクト名も、スプレッドシートのファイル名も適当でかまいません。

相手のメールアドレスなど入力した情報が間違いないかを確認して、いったんスプレッドシートを閉じてください。
再度開くとスプレッドシートのメニューに「メール」という表示が追加されます。
それをクリックすると、「1人ずつメール送信」というコマンドが表示されるので選択すると送信の処理が始まります。

「1人ずつメール送信」を実行するときは、つくった受信者の一覧のシートを開いておいてください。アクティブなシートを指定しているので。

最初にスクリプトの「許可」を求められます。画面に従って進めてください。

送信の処理が行われている間は、「スクリプトを実行中」という意味のメッセージが表示されています。
処理が終わったら、「送信状況」の列に「送信済み」という文字列が入力されます。
送信されたメールは、Gmailの「送信済み」ラベルのなかに入っています。

・送信できるメール数について

Gsuite Business の契約の場合、Google Apps Script で同じ日にメールを送信できる上限は、1アカウントあたり1500通だそうです。

上限以下だからといって、何百通も送信しようとするのはやめたほうがよいと思います。
Google Apps Script には「実行時間が6分」という制限があります。6分を超えるとエラーが出て止まるそうです。

ちなみに、Windows10でも試してみたら正常に送信されましたが、3件への送信で約5秒かかりました。100件で3分弱というところでしょうか。
■Windows10の環境
・Surface pro3 (Windows10 Pro バージョン1909)
Intel(R) Core(TM) i7-4650U CPU @1.70GHz 2.30GHz
メモリ8GB
・Google Chrome バージョン 80.0.3987.149


function onOpen(){
   //「1人ずつメール送信」というコマンドを表示する。
   var MailCommand=[
     {name: "1人ずつメール送信", functionName: "Mail_Kobetusousin"},
   ];
   //スプレッドシートのメニューに「メール」という表示を追加する。
   SpreadsheetApp.getActiveSpreadsheet().addMenu("メール",MailCommand);
    }

function Mail_Kobetusousin() {
   //■変数の宣言
   var i;
   var SheetName;
   var SheetRow;
   var Atesaki_Name;
   var Atesaki_MailAddress;
   var Mail_Kenmei;

   //メール本文にするGoogleドキュメントのIDを代入する変数
   var Document_id;
   //ドキュメントのIDをもとにメール本文にするドキュメントを特定して、オブジェクトとして受け取るための変数
   var Document_Object;
   //ドキュメントのオブジェクトからテキスト情報を抜き出して代入する変数
   var Document_no_Body;
   //ドキュメントのオブジェクトから抜き出したテキスト情報にある {お名前} の部分を、受信者の名前に置換したあとのテキスト情報を代入する変数
   var Oname_with_Body;

   var Sousinsya_Name;
   var From_no_Address;
   //■変数の宣言はここまで。

   //アクティブなシート名を取得
   var SheetName=SpreadsheetApp.getActiveSheet();
   //同シート上でデータが入力されている最後の行番号を取得
   var SheetRow=SheetName.getDataRange().getLastRow();

   //■ここからメール送信の繰り返し。
   for(i=2;i<=SheetRow;i++){
     //i<=SheetRow は「シートの最終行の数以下の間、処理を繰り返す」という条件。
     //i++ は、「繰り返しのたびに、変数 i を1つずつ増やす」ということを略した書き方。厳密には i=i+1 と書く。

     //シートにある氏名を変数に代入。シート上で受信者の氏名の列が左からいくつ目にあるかを、数字の部分で指定している。
     //受信者の氏名は1列目にあるので、SheetName.getRange(i,1) になっている。
     Atesaki_Name=SheetName.getRange(i,1).getValue();

     //受信者のメールアドレスを変数に代入。
     Atesaki_MailAddress=SheetName.getRange(i,2).getValue();

     //メール件名を変数に代入。
     Mail_Kenmei=SheetName.getRange(i,3).getValue();

     //メール本文にするドキュメントのIDを変数に代入。
     Document_id=SheetName.getRange(i,4).getValue();

     //送信者の氏名を変数に代入
     Sousinsya_Name=SheetName.getRange(i,5).getValue();

     //Fromに入れるメールアドレスを変数に代入
     From_no_Address=SheetName.getRange(i,6).getValue();

     //メール本文にするドキュメントをIDで特定して、オブジェクトとして取得。
     Document_Object =DocumentApp.openById(Document_id);
     //メール本文にするドキュメントのオブジェクトからテキスト情報を変数に代入。
     Document_no_Body=Document_Object.getBody().getText();
     //{お名前} の部分を受信者の氏名にしたいので、 {お名前} を変数Atesaki_Nameに置き換える。
     Oname_with_Body=Document_no_Body.replace(/{お名前}/g,Atesaki_Name);

     //メールを送信
     GmailApp.sendEmail(
         Atesaki_MailAddress,
         Mail_Kenmei,
         Oname_with_Body,
         {
             from: From_no_Address,
             name: Sousinsya_Name
         }
     );

     //アクティブなシートの7列目に「送信済み」の文字列を入力。
     SheetName.getRange(i, 7).setValue("送信済み");

   }//←for に戻って、スプレッドシートの最終行になるまで繰り返す。

          /*
          ■replaceメソッドについて
         『g』は、最後まで探すというフラグ。
          replaceメソッドでは、『g』フラグを付けないと1個目しか置換しない。

          ■sendEmailメソッドについて
          GmailApp.sendEmail( からのコードで、Gmailのメールを送付。
          受信側のメールアドレス、件名、内容と、sendEmailメソッドのオプションで送信側のアドレス、送信者名を指定。

          sendEmailメソッドに設定できる値は次のよう。

          GmailApp.sendEmail(
              送信先アドレス(to),
              メール件名,
              メール本文,
              {
              cc: 送信先アドレス(cc),
              bcc: 送信先アドレス(bcc),
              from: 送信元アドレス(from),
              noReply: false,
              replyTo:返信先アドレス(replyTo),
              name: 差出人名
              }
          )
          */
}

| | コメント (0)

UNIQUE関数で重複する行をなくす。

この記事は自分用の覚書です。

■MacBook Pro macOS Catalina
バージョン 10.15.3

■Office365 Business サブスクリプション
Excel for Mac バージョン 16.34 (20020900)

M.H さん。

最近使えるようになった関数で、うちの仕事で役立つと感じた関数は、一つ前の記事で扱っているXLOOKUP関数の他に、FILTER関数、SORT関数、UNIQUE関数があります。どれもOffice365サブスクリプショナーだけが使える関数のようです。

検索すれば、どの関数も使い方を説明してくれているサイトはすぐに見つかります。

この記事では、UNIQUE関数が我々の仕事で役立つ点にふれたいと思います。

表から重複する行をなくしたいことがよくあります。
UNIQUE関数を使うと簡単にその状態をつくれます。

仕事で扱う「重複をなくした表」には2つの状態があります。

1. 元の表で重複している行を省いた一覧

2. 元の表のときに、そもそも重複がない行を抜き出した一覧

どちらも簡単につくれるのが、UNIQUE関数のお役立ちどころです。

Uniquekansudetukuru

また、XLOOKUP関数の記事では特にふれませんでしたが、「元のデータをいっさいさわらない」のも、これら新しい関数に共通の利点といってよい気がします。

絞り込みや並べ替え、重複をなくす作業のときに、元データをうっかり消したり書き換えたりしないようにシートをコピーしたり、並べ替えの前に戻せるように連番を振っておいたりと、ちょっと気をつかうことってありますよね。

そういう気づかいが不要になります。

UNIQUE関数の引数

数式を入力するときに表示される関数ヒントでは、UNIQUE関数の書式は次のようです。
必須な引数は「配列」だけです。

・マイクロソフトのサイトにあるUNIQUE関数のヘルプ
UNIQUE(配列,列の比較,回数指定)

引数が少し分かりにくいです。

・引数「配列」
いわゆる、セル範囲です。

・「列の比較」
「TRUE - 一意の列を返す」を指定すると、"列方向" をみていって重複をなくします。
「FALSE - 一意の行を返す」だと、"行方向" をみていって重複をなくします。

関数ヒントで「列の比較」と表示されるのがわかりづらいですね。

「行方向」と「列方向」

「行方向」と「列方向」は、ワークシートを理解していないと迷うところだと思います。

次のようです。

Gyouhoukou

Retuhoukou

行方向と列方向を逆に考えそうになるので、気をつけてください。

状態「1.」でも「2.」でも、引数「列の比較」には FALSE を指定する。

表から重複する行を探すということは、表を上下(行方向)にみるということです。
なので、上の「1.」の状態をつくるときも「2.」の状態をつくるときも引数「列の比較」は FALSE です。

引数「列の比較」に TRUE を指定することは、我々の仕事ではほとんどないでしょう。

「列の比較」という引数名がほんとにわかりづらいです。
もっとわかりやすい引数名にしてほしいと思います。

引数「回数指定」について

慣れないと、この引数もわかりにくいかもです。

関数ヒントでは、
・TRUE は「1回だけ出現するアイテムを返す」
・FALSE は「個別のアイテムをすべて返す」
となっています。

引数「配列」で指定したセル範囲のなかで、「一度だけ出現するもの」を抜き出すときは、TRUE を指定します。
上記の「2つの状態」の「2.」ですね。
「元の表のときに、そもそも重複がない行」は、選択範囲のなかで「1回だけ出現するアイテム」です。

「2つの状態」の「1.」のほう——セル範囲のなかから重複している行を省いた状態にするのが、FALSEです。
「個別のアイテムをすべて返す」というのは、「2つの状態」の「1.」のことです。 

■1. 元の表で重複している行を省いた一覧
UNIQUE関数はスピルします。次の図では、数式はセルG13にだけ入力しています。

G13の数式は、 =UNIQUE(B2:D10,FALSE,FALSE) です。

関数がスピルして埋まった範囲は青い枠線で囲まれます。

1nojoutai

■2. 元の表で、最初から重複がない行を抜き出した一覧
次の図のセルG13の数式は、 =UNIQUE(B2:D10,FALSE,TRUE) です。

2nojoutai

ひょっとしたら、この記事がよけいにわかりづらくしたかもしれませんね。
すみません。

とにかく、我々の仕事で使う頻度がより多いのは、

=UNIQUE(B2:D10,FALSE,FALSE)

のようにセル範囲に続いて両方の引数で FALSE を指定する数式でしょう。
「1. 元の表で重複している行を省いた一覧」をつくる数式です。

範囲が増えるなら「テーブル」にしておく。

上記の例ではセル参照で指定しています。
この場合、追加があって行や列が増えたら、引数「配列」の修正が必要です。

追加に対応しておくなら、元の表の範囲を「テーブル」に変換して、引数「配列」ではそのテーブル名を指定してください。

テーブル名には日本語が使えます。
テーブル名の頭に英字を付けておくと便利です。数式を入力するときにその英字を打ったら候補にテーブル名が表示されます。

日本語だけのテーブル名だと、それを全部打たないといけません。候補が表示されないんです。

並べ替えにはSORT関数

並べ替えするには、SORT関数を使ってください。

UNIQUE関数の結果は、エクセルの通常の「並べ替え」機能(「データ」タブの「昇順」・「降順」)では並べ替えできませんでした。

XLOOKUP関数も同じでした。たぶん、FILTER関数も同じだと思います。

Office365サブスクリプションのExcelでない場合は、UNIQUE関数の結果をコピーしてどこかに値貼り付けして「並べ替え」を実行するしかないですね。

| | コメント (0)

使うなら、最新関数 XLOOKUP

この記事は自分用の覚書です。

■MacBook Pro macOS Catalina
バージョン 10.15.3

■Office365 Business サブスクリプション
Excel for Mac バージョン 16.34 (20020900)

字余り……。

M.H さん。

Excel for Mac でXLOOKUP関数が使えるようになりましたね。
(さっき、Windows版 Excel も確認しました。バージョン2001(ビルド 12430.20264)です。)

すごいです。もうVLOOKUP関数で表引きしている時代ではありません。

使い慣れているからといって、いつまでもVLOOKUP関数を使うのは、うちの社内では「懐古主義に毒された老害だ」と言いたくなります。

これからはXLOOKUP関数の時代です! と、全角のびっくりマークで強調したくなります。

XLOOKUP関数の使い方は、インターネット上でいろんな人が解説をしてくれているので、探せばいくつでも見つかります。

ここでは、私が使ってみて、うちの仕事で役立つと思った点にふれておきます。

マイクロソフトのサイトのヘルプを見ると、XLOOKUP関数には「Office 365」の表示があるので、Office365サブスクリプショナーだけが使える関数のようです。

検索/行列関数 (リファレンス)

■引数「列番号」が不要

地味ですが、これがかなり便利です。

VLOOKUP関数の書式は次のようです。

=VLOOKUP(検索値,範囲,列番号,検索方法)

引数「列番号」を指定するのに、元の表の左端から地道に列の数を数えたことってありますよね。
「……9列目だから、9か……」とか。

それがもう不要です。

さらに、入力したVLOOKUP関数の数式を右にコピーするとき、「列位置」は変わりません。
「9 を 10 にして、次の 9 は 11 で、次は 12 で……」と地道な修正をしたこともありますよね?

それももう不要です。

「MATCH関数やCOLUMN関数を使えば列の位置がわかる」なんて話ではないです。
それをしなくてもよいという話ですからね。

XLOOKUP関数では、VLOOKUPの「列数」にあたる引数は、セル範囲で指定します。
書式は次のようです。

=XLOOKUP(検索値,検索範囲,戻り範囲,[見つからない場合], [一致モード], [検索モード]) 

「戻り範囲」のところがそうです。

必須の引数は「検索値」「検索範囲」「戻り範囲」の3つです。
うちの仕事なら、たまに引数「見つからない場合」を使うときはあるでしょうが、残りの引数を使うことはとても稀だと思います。

■XLOOKUP関数は「スピル」します。

VLOOKUPと同じ使い方をするなら、スピルの元になるセルに数式を入れるだけで、他のセルには自動的に数式が埋まります。
数式のコピーが不要ということですね。

「スピル」を説明するのは難しいです。手元でやってみてください。
「自動的に数式を埋めてくれる」と書きましたが、実際には元になるセル以外のセルには数式は入っていません。

スピルで埋まったセルを見ると、数式がグレーになっています。"ゴースト" というそうです。
ダブルクリックすると、セルの中には何も入っていません。それでも値は表示されます。

Xlookup_vlookup

■列を抜き出したり、入れ替えたりが簡単

「列数の多い表で、特定の列だけ見えるようにしたい」ということがあります。

ちょっと前に、90列ほどある表から列をいくつか抜き出したことがありました。それも、並びを入れ替えて。
「12列目が一番左で、6列目がきて、23列目で、次が19列目で……」といった感じで。

90列もあると、飛び飛びの列だけが見えている状態にするのは、嫌になるほど面倒です。

そんなときも、XLOOKUP関数なら簡単です。

XLOOKUP関数では、引数「検索値」に表1行目の列見出しにある文字列を指定して、引数「検索範囲」では1行目全部を選ぶだけです。
(MATCH関数の要領ですね。)

で、その範囲から「検索値」が見つかったときに値を戻す「戻り範囲」には、表の2行目から下全部の範囲を選択します。
(引数「検索範囲」と「戻り範囲」は同じ大きさでないといけません。)

Xlookup_retuirekae

■引数「検索範囲」と「戻り範囲」を別々に指定できます。

XLOOKUP関数では、引数「検索範囲」と「戻り範囲」を別々のセル範囲にできます。

ということは、XLOOKUP関数では、表の列のどこであっても「検索範囲」と「戻り範囲」に指定できるということです。
右端でも左端でも途中でもどこの列でも検索値を探せて、どこの列からでも値を戻せます。
(この考え方は "行" に対しても同じです。)

なので、これまではINDEX関数とMATCH関数を組み合わせていた作業ですが、それも不要になるでしょう。
社内での使い方を考えると、全部XLOOKUP関数で対応できると思います。

「同じ結果が出るから、どちらのやり方でもよい」ということではないです。

これまでは2つの関数を組み合わせなければできなかったことが、1つの関数でできます。
効率の良さと、関数で何をしているかの読み解きやすさでいって、XLOOKUP関数を使うべきです。

うちの仕事でXLOOKUP関数が役立つと感じたところは以上のようです。
ぜひ、お手元で試してみてください。何か気づいたことがあったら私にも教えてくださいね。

| | コメント (0)

Googleスプレッドシートで西暦から和暦を求める。

この記事は自分用の覚え書きです。

H.K さん。

Googleスプレッドシートで、西暦から和暦を求める表を作ってみました。
今のところ、エクセルのように表示形式で和暦を表示する機能は、Googleスプレッドシートには無いようですね。

Google Apps Script でのやり方とかネット上で見かけましたが、誰もがさわれるものではありません。
誰でもさわりやすいツールにしておくには数式を使うのがよいかなと思いました。
なので、数式で和暦を求めることにしました。

使っている関数は、YEAR関数、MONTH関数、IF関数とAND関数です。

■課題

Googleスプレッドシートにもともと入っている日付で、一番古いものは2000年7月。
一番新しいものは2019年2月。2月以降の日付は今後増えていく。
西暦/月/日 の形で入力してあるセルはそのままで、和暦だと何年何月かがわかるようにしたい。日は不要。

■考え方

Googleスプレッドシート上にある一番古い日付は2000年7月ということなので、この場合は平成と令和だけを考えればよいということです。
(昭和以前は不要)

今年2019年5月1日から、元号が平成から「令和」に変わりました。
2019年は平成31年と令和1年が重なっていて、考え方が少しややこしいのでいったん横に置いておきます。

考えやすいのは2018年(平成30年)かと思います。
まずはそこから考えていきます。

2018 から平成元年である 1989 を 引いて、それに 1 を足せば2018年が平成何年なのかがわかります。
2018-1989+1=30 になるので平成30年です。

なお、一番古い日付は2000年7月なので、昭和が平成と重なっていることも考慮しなくてよいということです。
ということは、Googleスプレッドシート上で平成元年以降の各西暦から 1989 を 引いて、それに 1 を足せばそれぞれの西暦が平成何年なのかがわかります。

2000年は、2000-1989+1=12 で平成12年です。
このように、西暦 - 1989 + 1 の式で、2018年までは平成何年かを求めることができます。
そして、平成31年にあたる2019年は平成と令和が重なっているので、式の答えが31未満のうちは、その西暦は全て「平成」です。

ちょっと工夫が必要なのが今年2019年ですね。
2019年1月から4月までが平成31年で、5月以降は令和元年(令和1年)になります。
西暦 - 1989 + 1 の式の答えは 31 です。

このことから、次の2つが同時に成り立てば、2019年のある日付は「平成」ということになります。
A. 2019-1989+1 の答えが 31 と等しい。
B. 2019年のある日付の「月」が 4 以下。(1 から 4 までのどれか)

同じように、次の2つが同時に成り立つ場合は、2019年のその日付は「令和」ということなります。
A. 2019-1989+1 の答えが 31 と等しい。
B. 2019年のある日付の「月」が 5 以上。(5 から 12 までのどれか)

そして、令和元年が平成31年と重なっているので、2020年以降では西暦について次のことが成り立てば、その日付は「令和」になります。
・西暦 - 1989 + 1 の答えが、31 より大きい。

■これらに基づいて表を作りました。

これらを全部処理する数式を、1つのセルに入れてしまうと、それも何をしているのかパッと見てわかりづらい数式になります。
作業列をつかって処理をわけました。そうしておけば、全体を通して何をしているのが誰にでも理解しやすくなるかと思います。

仕事で作るファイルは誰のものでもありません。皆のものです。
なので、仕事で作るファイルは、できる限り誰が見ても理解しやすく作っておくべきです。

Seireki_wareki01 

A列がもともと入っている日付です。

数式は以下のようになっています。
何をしているかを少しでも読み取りやすくなるように、各式をセル内改行してみました。

Seireki_wareki02

■各列に入っている数式

・西暦(B列)
=if(A2="","",
if(A2<>"",YEAR(A2),
))

B列では、A列をもとにYEAR関数で「西暦」だけを抜き出しています。
A列が空欄の場合はセルに何も表示しないように、IF関数で「A列のセルが空欄ならセルに何も表示しない」ということにしてあります。
というのは、A列が空欄だとB、C、E、F、G列に無用な答えがが入ってしまうからです。

・月(C列)
=if(A2="","",
if(A2<>"",MONTH(A2)
))

なので、C列以降も同様にして、数式内で参照している列のセルが空欄なら何も表示しないということにしました。
C列では、A列の日付からMONTH関数で「月」を抜き出しています。

D列の「平成元年」の 1989 は、例では手入力しています。
実際には、3行目以降は =$D$2 とかにして、先に入力した値を参照するようにしておけば、行をコピーして増やすときに便利かと思います。

・平成(E列)
=if(B2="","",
if(B2<>"",B2-D2+1
))

E列で、西暦 - 1989 + 1 の計算をして、B列の西暦が平成でいえば何年になるかを求めています。

・和暦(F列)
=IF(A2="","",
IF(E2<31,"平成"&E2,
IF(AND(E2=31,C2<=4),"平成"&E2,
IF(AND(E2=31,C2>=5),"令和"&E2-30,
IF(E2>31,"令和"&E2-30,
)))))

F列が平成か令和を判定している列です。
まずE列の「平成」の値が、31 より小さければ「平成」という文字列とE列のセルの値を結合して表示します。

次にIF関数とAND関数を使って、
A. 2019-1989+1 の答えが 31 と等しい。
B. 2019年のある日付の「月」が 4 以下。
が同時に成り立てば、「平成」という文字列とE列のセルの値を結合して表示するようにしてます。

細かいことをいえば、「"月" が 1 から 4 までのどれか」ですが、この場合は 1 から 4 までの4つの数字しかありえないので、「4以下」という数式にしてあります。

それから「令和」の年数を表示するために、
A. 2019-1989+1 の答えが 31 と等しい。
B. 2019年のある日付の「月」が 5 以上。
が同時に成り立つ場合は、文字列「令和」とE列のセルの値から 30 を引いたものを結合して表示するようにしています。
(ここも先と同じで、5 から 12 までの8つの数字しかないので、「5以上」という数式にしました。)

ここでE列の値から 30 を引いているのは、2018年が平成30年だからです。
30 を引いておかないと、令和1年になりません。

さらに、同じ考え方でE列の値が 31 より大きい場合も、令和2年以降を表示するために文字列「令和」と 30 を引いたものを結合しています。

・月(G列)
=if(C2="","",
if(C2<>"",C2,
))

最後に、G列ではC列の値を単純に参照しているだけです。「月」なので。

ここでC列と同じことをするのだから、先にC列で「月」を抜き出しておくのは不要な気もしましたが、「元の日付から西暦と月を抜き出している」ことがより見た目でわかりやすくなるかと思って、C列で「月」を抜き出して、それをG列で参照するようにしました。

このように、あることを「なぜそうするのか」あるいは「そうしないのか」について、具体的な理由があることもエクセルでファイルを作る際には大事です。たいそうな理由でなくてもよいです。先に挙げたように、「より理解しやすくするためにそうした(そうしなかった)」という程度で。

具体的な理由がないと、あとあとどこかを少し変えたいとなったときに、そもそも変えてよいのか、変えるには何に留意しておくべきかということがわかりません。
(だから、ファイルを引き継ぐ際には、その具体的な理由も引き継いでおく必要があります。)

長くなりましたが、処理の過程を作業列で分けてあるので、各列で何をしているのかも、全体を通して何をしているのかも理解しやすいと思います。

| | コメント (0)

macOSの「プレビュー」でPDFを編集する。

この記事は自分用の覚え書きです。

■macOS Mojave バージョン10.14.4

macOSに標準でインストールされている「プレビュー」だけで、PDFを編集できる。
次のようなことが可能
(編集制限がかかっていないPDFに限る。)

1.PDFにページを追加する。(複数のPDFを1つにまとめる。)
2.PDFからページを削除する。
3.PDF内でページを移動する。
4.PDFからページをコピーして、別のPDFとして保存する。(元のページは無くならない。)

1から3の操作は、command + Z で元に戻せる。
ただし、操作後に「プレビュー」を閉じると、即上書きになる。
上書きの確認はされない。

元のPDFを変えたくない場合は、先にコピーしてそれを使う。

Mac の「プレビュー」で PDF のページを追加する/削除する/移動する
リンク先にある「PDF サイドバーからデスクトップにサムネールをドラッグすることで、新しい PDF を作成することもできます。」の操作が、上記 4. にあたる。
デスクトップに限らず、自分のMac上ならどこにドラッグしてもよい。

また、「あるPDFの任意のページを、別のPDFに挿入する」といった操作も「プレビュー」で可能。
Mac の「プレビュー」で PDF を結合する

| | コメント (0)

Excel for Mac で、ふりがなが入力できない現象の回避

この記事は自分用の覚え書きです。

■macOS Mojave
バージョン 10.14.3
標準の日本語入力。

■ Office365 Business サブスクリプション
Excel for Mac バージョン 16.23(190309)

■起きている現象
option + shift + ↑ で、ふりがな編集の状態にできるが、ふりがなの入力ができない。
ひらがなを入力する状態にしてあるのに、英字しか入力できない。
ふりがなの領域をクリックしても、カーソルがそこにいかない。

Hurigana1

■回避策
option + shift + ↑ で、ふりがな編集の状態にしたら、なんでもいいのでいったん英字を打つ。
そうすると、ふりがなの領域をクリックできるようになり、ひらがなも打てるようになる。

Hurigana3

Hurigana4

Hurigana5

| | コメント (0)

Excel のソルバーで制約条件を整数にしてあっても少数になる。

この記事は自分用の覚え書きです。

■macOS Mojave
バージョン 10.14.3
■ Office365 Business サブスクリプション
Excel for Mac バージョン 16.22(190211)

ソルバーを使えるようにする。

メニューの「ツール」から「Excel アドイン」を選択。

「Solver Add-in」にチェックを入れて、OKをクリック。
これでソルバーが使える。

課題

ソルバーを実行すると、変数として指定したセルの制約条件を「整数」に指定してあるのに少数が入ってしまう。(下図:B列のセルが少数になっている。)

次の制約条件を守りながら、人数を変えていって総計金額が最大になるところを探っている。

・人数のセル( B2 から B4)は整数。(人数なので)
・総人数10名以下。
・各金額ごとに1名以上。(0名は無し。)
・総計金額30万円以下。

Solver_jikkougo1

原因

ソルバーの「オプション」で「整数制約条件を無視する」にチェックが入っている。

「オプション」を変更してソルバーを実行する。

メニューの「ツール」から「ソルバー」を選択。

「ソルバーのパラーメーター」の画面になるので、「オプション」をクリック。

Solver_option1

「整数制約条件を無視する」のチェックを外してOKをクリック。

Solver_option2

「ソルバーのパラメーター」の画面に戻るので、「解決」をクリックすると計算が始まる。

「ソルバーの結果」が表示されたら、変数として指定したセルに入っているソルバーの結果を確認。

ソルバーの結果がそれでよければ、「ソルバーの解の保持」にチェックを入れてOKをクリック。
(「計算前の値に戻す」にチェックを入れると、ソルバーの結果をセルに入れない。)

Solver_kaiketu

「整数制約条件を無視する」のチェックを外したので、変数として指定したセルに整数が入力される。(B列のセルが整数になっている。)

Solver_jikkougo2

| | コメント (0) | トラックバック (0)

セル内改行ごとに文章を分ける。

この記事は自分用の覚え書きです。

■macOS Mojave
バージョン 10.14.3
■ Office365 Business サブスクリプション
Excel for Mac バージョン 16.22(190211)

M.K さん。

職場に Mac が入ってきましたね。慣れていないので、使っているとなんか変な気分です。
いろいろ話を聞いていると、どうも今後は Mac になっていくような……。

うちの社内でバリバリとエクセルを使うというのなら、Windows版エクセルのほうがよいと思うのですが。

社内のPCがどうなるかなんて僕らにはどうにもならない話です。不平不満は飲み込んで、粛々と従うしかないですね。

とはいえ、愚痴を言いたくなるもので——Mac版エクセルは、致命的ではないですがどこか雑な感じがします。
なにより、Windows版には実装されている「データの取得」がありません。

これには驚きました。
Excel for Mac のユーザーはずっとこの環境を強いられていたんですね。今もまだ……。

米マイクロソフトのサイトにある "excel.uservoice" の "Add PowerPivot to Mac excel" というカテゴリーには、「早く実装してください!」といった声がたくさん寄せられています。
「データの取得」が実装されるのはいつになるやら——です。

そういえば、Office365サブスクリプションですよ。お金を定期的に取っておいて今まで放置——実装されるのはいつになるかわからない——なんていうのは……マイクロソフトもなかなか太いことをするなあと思います。

大人の事情がいろいろあるんでしょうね。

とまあ、セル内改行をしている文章を、それぞれ別のセルに分ける件です。
1つの段落内に「。」が複数箇所あるので、「。」を区切り文字付きの「。/」といった感じに置換するやり方では、改行ごとに分けることはできません。

Hukusuumaru_wo_kugirimojituki_ni_ku

■考え方
Windows版でもそうですが、セル内改行は改行コードを伴っています。目には見えませんが。
だとしたら、改行コードそのものを区切り文字に置き換えてやれば、エクセルの「区切り位置」の機能を使って、セル内改行ごとに分けることができます。

■手順
ここでは、CHAR 関数と SUBSTITUE 関数を使っています。

Cellnai_kaigyouwo_tikan

1. CHAR 関数で改行コードを生成
=CHAR(10) の数式で改行コードを生成できます。
Windows版エクセルと同じです。

Excel for Mac では「CHAR(13) が改行コードになる」との記述がネットでは見当たりますが、私の手元では CHAR(10) で改行コードを生成できています。

Excel for Mac のバージョンによって違うのかもしません。そのあたりは私にはわかりません。

2. SUBSTITUE 関数でそれを区切り文字(上図では半角の / )に置換
何をしているかがより理解しやすいように、作業列で CHAR 関数と SUBSTITUE 関数を分けました。(セル B2 と C2 )

セル A2 のなかにある改行コードが、セル C2 では / になっています。

区切り文字として使える字数は1文字。
仮に、SUBSTITUE 関数で改行コードを // に置き換えても、「区切り位置」の機能では使えない。

3. SUBSTITUE 関数が返してきた結果( C2 )をコピーして、任意のセルに「値貼り付け」。
C2 のままでは「区切り位置」の機能は使えないので、隣のセル( D2 )に値貼り付けしています。

4. セル D2 を選択しておいて、「データ」タブの「区切り位置」をクリック

5. 「区切り記号付き」にチェックを入れて「次へ」

01kugiriiti

6. 「その他:」をチェックして隣の欄に区切りとして使う文字を入力し、「次へ」
区切り文字は全角と半角を区別する。
SUBSTITUE 関数で改行コードを半角の / に置換しているので、ここでは 半角の / を入力している。

02kugiriiti

7. 今回扱っているのは単なる文字列なので、列のデータ形式は「標準」のままでよい。
「表示先」で任意のセル参照を入力。(図では E2 )

03kugiriiti

8. 「完了」をクリックするとセル D2 の文字列が別々のセルに分かれる。

| | コメント (0) | トラックバック (0)

Googleスプレッドシート上で文字列を翻訳する関数

この記事は自分用の覚書です。

T.M さん。

Googleスプレッドシートのセルに入っている文字列を、Google Apps Script を使って翻訳するカスタム関数です。

function から この記事の一番下にある } までコピーして、Googleスプレッドシートのスクリプトエディタに貼り付けてください。

詳細はコメントに書いてあります。

------------------------------------------------

function translation(originalText, translateFrom, translateInto) {

  if ( originalText.length > 0 ) {
    return LanguageApp.translate(originalText, translateFrom, translateInto);
  } else {
    return '';
  }
 
 
/*ここからコメント
このコードを使うことで、
=translation(A2,"en","ja")
といったカスタム関数で、Googleスプレッドシートのセルに入っている文字列を指定した言語に翻訳できる。
(上記の数式は、「セル A2 に入っている "英文" を "和文" に訳する」数式)

裏でGoogle翻訳のサービスを呼び出して翻訳する。
GOOGLETRANSLATE関数を使うよりも、翻訳の精度が高い。


■コード内で使っている変数について
originalText, translateFrom, translateInto の3つは変数。
translateメソッドの引数としては、
var originalText
などといった変数の宣言は不要。

・originalText
カスタム関数の引数のうち、セル参照を受け取るための変数。
・translateFrom
翻訳したい原文が何語なのかの明示を受け取るための変数。
・translateInto
原文を何語に翻訳するかの指定を受け取るための変数。


■このコードを使う準備。
1.このコードをコピーする。
一行目の function から一番下の行の } まで。

2.翻訳したい文字列が入っているGoggleスプレッドシートを開く。

3.メニューの「ツール」から「スクリプトエディタ」を選択。

4.スクリプトエディタが別タブで開く。
あらかじめ書かれているコードは削除する。

5.このコードを貼り付ける。

6.「無題のプロジェクト」と書かれてある左上の欄に、任意の名前をつける。
全角日本語や半角の英数、アンダーバーが使える。

7.コードを保存する。
スクリプトは、保存操作をしないと保存されない。

8.いったんスクリプトエディタのタブを閉じる。
これで準備完了。

このカスタム関数が使えるのは、そのGoogleスプレッドシートでだけ。
別のスプレッドシートで使うには、同じように準備することが必要。


■カスタム関数の使い方
例:GoggleスプレッドシートのセルA2に入っている英文を和訳して、セルB2に和文を表示する。
セルB2に次の式を入力する。

=translation(A2,"en","ja")

英数半角の入力モードにして、 = に続いてカスタム関数名を記述する。ここでは、 translation 。

次に、 ( ) で囲んだ引数を記述する。引数は , (カンマ)で区切る。
1つ目の引数は英文が入っているセルをセル参照の形式で指定。ここでは、 A2 。
2つ目の引数で、セルに入っている文字列の言語を指定。 "en" は「英語」ということ。 en は文字列なので " " で必ず囲む。
3つ目の引数で、翻訳結果を何語で表示するかを指定。 "ja" は「日本語」ということ。 こちらも " " で囲む。

translateメソッドの構文は、
translate(text, sourceLanguage, targetLanguage)
になる。
sourceLanguage(ソース言語)とtargetLanguage(ターゲット言語)は、iso-639-1 コードを使用して指定する。

・language codeについて
https://cloud.google.com/translate/docs/translating-text#language-params

List of ISO 639-1 codes
https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes

・if...else文について
条件として、
originalText.length > 0
を判定している。意味は、「変数 originalText が 0 ではない。」ということ。
=translation(A2,"en","ja") の数式によって、
変数 originalText は、セル A2 に入っている値を受け取る。
A2 に文字列が入っていれば、「セル A2 は 0 ではない」ということになる。
翻訳したい文字列がセルに入っている場合にのみ、翻訳結果が表示されるようにするため。

セルに文字列が入っている場合は、条件が成立するので、 LanguageAppクラスのtranslateメソッドが実行されて、その結果をreturn文が返してくる。
(数式を入れたセルに訳文が表示される。)

セルが空の場合は、 条件が成立しないので、translateメソッドが実行されず、else以下のreturn文が実行されて空欄が返される。
(数式を入れたセルには何も表示されない。)

もし、和文を英訳したい場合は、
和文が入ったセルを、1つ目の引数で指定して、上記の2つ目と3つ目の引数を入れ替える。
セルA2に和文が入っていて、英訳したい場合の数式は、

=translation(A2,"ja","en")

になる。

ここまでコメント*/
}

| | コメント (0) | トラックバック (0)

より以前の記事一覧