2018年11月

私はこれまで、中小企業(中小企業Aと呼びます)と、1部上場企業の子会社(子会社Bと呼びます)と2種類の企業規模の社内SEを経験しています。中小企業の社内SEについては、以前記事を書きましたが、今回は中小企業と上場企業の子会社の社内SEの比較を実体験を元に比較したいと思います。
当然ですが、あくまで私が勤めた会社の実態ですので、すべての子会社SEが同じとは限りません。しかし子会社は「親会社のシステムやポリシーの影響を受ける」ということは、多くの子会社で共通するキーワードだと思います。

大企業の子会社と中小企業と、どちらの社内SEにかろうか悩んでいる人に参考になれば幸いです。



ちなみに私は下記の流れで転職しています。
中小企業A→子会社B→中小企業A
「中小企業A」が2回出てきます。それぞれ異なる会社ですが、ほぼ同じ規模なのでどちらも「中小企業A」と呼びます。


大企業と中小企業のイメージ


まず、私は社員30人程度の「中小企業A」に長く勤めていたため、大企業に対してスゴイ憧れをもっていました。

私の大企業のイメージ

  1. システム規模がデカイ
  2. 予算が多い
  3. 備品が豊富(PC、ハブなど)
  4. 組織がしっかりしてる(何事もチームで動く)
  5. 教育体制が整っている
  6. 優秀な人がいる
  7. 給料が良い

「中小企業A」の実態(子会社Aを経験する前の私の印象)

  1. システム規模が小さい
  2. 予算少ない
  3. 備品はない(壊れたらすぐヨドバシへ)
  4. 組織ガタガタ(なにごとも一人で対応)
  5. 教育体制なし(同職種がそもそもいない)
  6. 優秀な人はいる
  7. 給料はまぁまぁ納得

子会社だって、大企業の良いイメージそのままで、中小企業よりよっぽど良い環境だと思ってました。


〜〜〜〜〜

それではいよいよ1部上場の子会社の社内SEの実態を解説します。


1.システム規模

「子会社B」は「中小企業A」とは比べられないくらいの規模です。理由は親会社のシステムと融合していたためです。そのため親会社のセキュリティポリシーに従う必要があったり、ファイアウォールが親会社管理のもので、設定変更するために親会社に申請が必要だったりと、自由がききませんでした。

「中小企業A」はサーバは倉庫、ネットワーク機器はiodataやbuffalo製でしたが、「子会社B」はちゃんとデータセンターで運用し、ネットワーク機器はCisco製です。

個人的なイメージですがCiscoを使っていると、経験として転職時にアピールできると思います。と言うのも「子会社B」に転職できたのは、私がCCNAに合格していてことが大きかったと子会社Bの上司から入社後に明かされたことがあるためです。家庭用機器の経験がいくらあっても、経験として評価されずらいでしょう。

データセンターの利用に関しても、倉庫で運用するよりは評価されるでしょう。倉庫で運用すると、年に一回のビルの電気設備停電への対応が面倒だったりします。


2.予算

中小企業Aに予算の概念はありませんでした。必要な時に申請して購入します。
子会社Bも予算の概念はありませんでしたが、資金が豊富なため、保守契約が充実しており、何かトラブルがあっても、基本メーカーやベンダーが対応してくれます。中小企業Aは、最低限の保守契約しかなく、基本トラブルは自分で解決します。


3.備品について

中小企業Aには余剰PCやハブはありませんでした。せいぜい退職者が使用していたPCがある程度ですが、それも古いものばかりです。
子会社Bは、ハブなどは豊富にありますが、PCに関しては、親会社の仮想環境を利用していたため、自由にやりくりすることはできませんでした。



4.組織体制

中小企業Aでは、ずっと1人でしたが、子会社Bは3人体制(リーダー1人、メンバー2人)でした。3人いれば相談したり、助け合ったりできる点はメリットです。会社を休む時も安心です。
1人の場合、自分のペースで仕事ができたり、自分のやりたいようにできるのは大きなメリットです。課題に対しては、自分ができなければ、他の誰にもできないし、そもそも実現可能かどうかの判断すら自分にしかできないので、もし自分では対応できない課題があっても、周りは実現不可能なんだと諦めてくれます。
ただ、ユーザーからのクレームにおいては、1人での対応は困難があります。1人でなんとかクレームを解消するなり、打開策を考えるなりしなければならず、精神が病みそうになるときがあります。


5.教育体制

これはどちらも無いです。ただ子会社Bは、親会社の社長が執筆した本を読んで感想を言い合うという儀式がありました。


6.人材

子会社Bは、兄弟会社にSIerがあることもあり、システムが分かる人材には事足りません。困ったことがあれば、質問できる人は大勢います。しかし、スキルのある人は多忙を極めていて、電話もメールも音信不通です。
中小企業Aには、私と同レベルでシステムが分かる人材はいません。しかし、優秀な人の割合は子会社Bと変わらないか、それより多かったかもしれません。中小企業Aは社員数が少ないこともあり、子会社Bより団結力があり、困ったことがあれば助けてくれる風土がありました。


7.給料

給料は子会社Bが少し多かったです。賞与がちゃんとあったことが理由です。



以上、簡単ではありますが、中小企業と子会社の社内SEを比較しました。
組織に守られながら、人から評価されやすい仕事ができる子会社B。お金はなくとも自由があり、自分の工夫しだいで何でもできる中小企業A。どちらが魅力的に映ったでしょうか?



メールをエクセルのような表形式に自動的にデータ化したいと思ったことはないでしょうか?今回はgmailとスプレッドシートでその実現方法を解説します。

目次

1.メールの設定

まず受信するメールに一工夫必要です。
受信するメールの本文をXML形式にします。XML形式などと聞くと難しそうに感じる人もいるかもしれませんが、超簡単です。データ化したい項目ごとにテキトーに命名したタグで囲ってあげればOKです。

例:
<inquiry>
    <name>〇〇太郎</name>
    <email>xxx@xxx.co.jp</email>
    <tel>03-1234-1234</tel>
<item>車</item> </inquiry>

まず親要素として<inquiry>タグで全体を囲います。
子要素として、好きな名前のタグで囲います。

注意点として、メール本文には、このXMLデータだけが書かれた状態にしてください。

メールの件名は「WEBSHOP」が含まれるようにします。件名を変更する際は手順2-8の設定も変更して下さい。

メールの準備は以上です。


2.Googleスプレッドシート(Google Apps Script)の設定

2-1.データ受け取り用のスプレッドシートを新規作成します。

2-2.シート名を「data」とします。

2-3.スプレッドシートのメニューより、ツール→スクリプト エディタをクリックします。

2-4.スクリプト エディタが起動します。最初は下記の状態になっています。
2
ここにプログラムを書いていきます。


2-5.まず、gmailの受信ボックスからデータを取り出す対象のメールの条件を設定します。
記入したソースはこちら。
var threads = GmailApp.search("is:unread from:'xxx@xxxxx.xx.jp'",0,100);

書式は下記です。
GmailApp.search(検索条件, 開始位置, 最大取得数)

■検索条件
未開封のメールを対象とするので「is:unread」を付けます。
「from」でどのアドレスから届いたメールを処理対象とするか決めます。

■開始位置
すべてのメールを対象とするので「0」を指定します。

■最大取得数
とりあえず「100」としました。

最大取得数に関しては、この後に説明するスクリプトの自動実行と絡みますが、gmailへの一日のアクセス回数は20,000回の制限があるため、自動実行させす頻度に合わせて最大取得数の調節が必要です。

例えば、最大取得件数100で、1分ごとにこのスクリプトを自動実行すると、
100×60(分)×24(時間)=144,000
と一日の制限を超えてしまいます。
なので、このスクリプトは10分ごとの自動実行に設定する必要があります。
100×6×24時間=14,400



2-6.書き出したいスプレッドシートの情報を記入します。
var fileid = "スプレッドシートのID";
var sheetfile = SpreadsheetApp.openById(fileid);
var sheet    = sheetfile.getSheetByName('シート名');

スプレッドシートのIDはスプレッドシートを開いた状態でアドレスバーの「/d/」から「/edit」までの間の文字列です(下の画面の赤枠部分)。
4スプレッドシートのIDの調べ方

シート名は手順2-2で設定した「data」を指定します。



2-7.メールのデータを抽出する部分のコードです。
threads.forEach(function(thread) {
  
   var messages = thread.getMessages();
   
   messages.forEach(function(message) {
    
        var message_id = message.getId();
        var date = message.getDate();
        var subject = message.getSubject();
        var body = message.getPlainBody();
        var to = message.getTo();
        var from = message.getFrom();
上記でメッセージID、日付、件名、メール本文、メール送信先アドレス、メール送信元アドレスを取得します。


2-8.件名に文字列「WEBSHOP」が含まれているメールのみを処理対象とするため下記を記入します。
if(!subject.match("WEBSHOP")){
  return;
}


2-9.スプレッドシートにすでに記入済みのメールを除外するために、スプレッドシートのA列のデータをRegistedMIDに取得します。
var RegistedMID = sheet.getRange(1, 1, sheet.getLastRow()).getValues();
「sheet.getLastRow」でA列の最終行数が取得できます。



2-10.メールのメッセージIDとスプレッドシートに登録済みのメッセージIDを比較して、すでに登録済みであれば、処理をスキップします。
for(var i=0; i < RegistedMID.length; i++) {
  if(RegistedMID[i] == message_id){
    return;
  }
 }

2-11.メール本文のXMLデータを分解します。
var xml = XmlService.parse(body);//bodyをXMLパーサーで解析
var root = xml.getRootElement();//XML解析結果のルート要素を取得

// XML内の各子要素を指定してその値を取得。
var name = root.getChild("name").getText();
var email = root.getChild("email").getText();
var tel = root.getChild("tel").getText();
var item = root.getChild("item").getText(); 


2-12.スプレッドシートに書き込みます。
sheet.appendRow([message_id,date,subject,to,from,name,email,tel,item]);


2-13.最後に、メールを既読にしておきます。
message.markRead();


プログラムは以上です。プログラム全体は下記のようになります。
function myFunction() {

  var threads = GmailApp.search("is:unread from:'xxx@xxxxx.xx.jp'",0,100);
  var fileid = "スプレッドシートのID"; //スプレッドシートのID
  var sheetfile = SpreadsheetApp.openById(fileid);
  var sheet    = sheetfile.getSheetByName('data'); //シート名dataに書き込み

  threads.forEach(function(thread) {
    
     var messages = thread.getMessages();
     
     messages.forEach(function(message) {
      
          var message_id = message.getId();
          var date = message.getDate();
          var subject = message.getSubject();
          var body = message.getPlainBody();
          var to = message.getTo();
          var from = message.getFrom();
  
          //件名に「WEBSHOP」が含まれているメールのみを対象とする。
          if(!subject.match("WEBSHOP")){
            return;
          }

          //スプレッドシートに登録済みのメッセージIDのメールは処理対象から外す START
          //スプレッドシートに登録済みのメッセージIDを取得
          var RegistedMID = sheet.getRange(1, 1, sheet.getLastRow()).getValues();
  
          //スプレッドシートに登録済みのメッセージIDの場合、処理をスキップ
          for(var i=0; i < RegistedMID.length; i++) {
            if(RegistedMID[i] == message_id){
              return;
            }
           }
          //スプレッドシートに登録済みのメッセージIDのメールは処理対象から外す END
          
          var xml = XmlService.parse(body);//bodyをXMLパーサーで解析
          var root = xml.getRootElement();//XML解析結果のルート要素を取得
    
          // XML内の各子要素を指定してその値を取得。
          var name = root.getChild("name").getText();
          var email = root.getChild("email").getText();
          var tel = root.getChild("tel").getText();
          var item = root.getChild("item").getText();   
          
          sheet.appendRow([message_id,date,subject,to,from,name,email,tel,item]);//スプレッドシート書き込み
          message.markRead(); //メッセージを既読にする
      });
  });  
}


3.実行


3-1.実行ボタンを押して、プログラムを実行します。
5実行ボタン


3-2.下記のメッセージが出るので「許可を確認」ボタンをクリックします。
--------------------------
承認が必要です
無題のプロジェクトneeds your permission to access your data on Google.
--------------------------
5承認が必要です画面



3-3.アカウントの選択画面で、使用するGoogleアカウントをクリックします。

5-3アカウントの選択

3-4.「このアプリは確認されていません」と表示されます。左下の「詳細」をクリックします。
5-5このアプリは確認されていません2


3-5.画面最下部の「無題のプロジェクト(安全ではないページ)に移動」をクリックします。

5-4このアプリは確認されていません


3-6.“無題のプロジェクトがGoogleアカウントへのアクセスをリクエストしています”と表示されるので、「許可」ボタンをクリックします。
BlogPaint




4.デバッグ方法

4-1.ソースコードの左にある行番号をクリックするとブレークポイントが設定できます。
6-2ブレークポイント


4-2.デバッグボタンを押すと、ブレークポイントで止まります。
6デバッグボタン


4-3.画面下部にブレークポイントまでの変数の状態が表示されます。
この例では「to」のアドレスまで変数に取得できていることが分かります。
6-3デバック画面



5.自動実行の設定

5-1.「現在のプロジェクトのトリガー」ボタンをクリックします。

5-2.「トリガーが設定されていません。今すぐ追加するにはここをクリックしてください。」をクリックしてください。

7-2現在のプロジェクトのトリガー

5-3.時間ごと、日ごと、1分ごと、1時間ごと、など、さまざまな設定が可能です。
設定後に、「保存」ボタンをクリックしてください。
7-3現在のプロジェクトのトリガー

以上です。



↑このページのトップヘ