その他効率化・改善

YouTubeシークバーを表示/非表示するブックマークレット(PC、Chrome)

0.はじめに

今や一般化したyoutube、業務利用する機会も出てきました。
社用コンテンツを非公開コンテンツとしてアップしたり、
社外向けのPRコンテンツをアップしたり。
我々のように少しプログラムを書くような人たちは
調べものに使う事も多いかと思います。

調べものをしていて一時停止した時、
「シークバーが邪魔・・・」という事はないでしょうか。
私自身、この思いをする事が非常に多く、
拡張機能を入れずに問題を解消したためその方法を紹介します。

1.イメージ

「ブックマークレット」をご存知でしょうか。
Chromeのブックマークを選択する事で、プログラムを実行するものです。

ブックマークバーにスクリプトレットが登録されているイメージ

この画像の「hideSeekBar」や「showSeekBar」をクリックして、
表示状態を切り替えるイメージです。

2.手順 – ブックマーク作成画面を開く

Chromeのブックマークバーを右クリックして、「ページを追加」を選択してください。

ブックマークバーにページを追加

3.手順 – スクリプトを貼り付ける

追加画面で、名前欄とURL欄に登録して保存します。
名前はご自身の分かり易いものを登録してください。

ブックマーク登録画面でコードを入力

尚、非表示にする機能と表示する機能の2つのブックマークを作成しますので、
この手順は2回行う必要があります。

URL欄に貼り付けるべきコードはこちらになります。(2024/2/12時点)

// シークバーを非表示にする
javascript:(function(){document.querySelector(".ytp-progress-bar-container").style.display="none"})();
// シークバーを表示する
javascript:(function(){document.querySelector(".ytp-progress-bar-container").style.display="block"})();

尚、youtubeのページ仕様変更に伴ってコード変更が必要となる場合があります。
後述しますので、この時点で対処方法が分からない方は必ず読んでください。

4.手順 – 実行してみる

では、実際にyoutubeの動画を再生して一時停止、
作成したブックマークをクリックしてシークバーを操作してみてください!
どうでしょうか。うまく動作しましたか?

5.仕組と注意点

さて、ブックマーク登録の項で少し触れましたが、
youtubeのページ仕様変更があった場合に使えなくなる可能性があります。

登録したjavascriptコードの中身はこうなっています。
document.querySelector(“.ytp-progress-bar-container”).style.display=

この命令をざっくりと日本語に意訳すると、下記のようになります。
「ページ内の”.ytp-progress-bar-container”という場所について表示スタイルを変更してください」

もし仮にシークバーが
“.ytp-progress-bar-container”から “.progress-bar-container”などに変わったとしたら・・・?
既存命令分の”.ytp-progress-bar-container”ってどこ?となり、動かなくなります。

ですので動かなくなった際には、
シークバーの構成が変わっていないか調べてコードを変更する必要があります。
DevToolでページ構成を調べれば簡単なのですが、今回はメンテナンス方法については割愛します。
もし上記のコードで動かなくなっていたら、コメントか何かで教えてください。

6.最後に

いかがでしたでしょうか。
これを実装しようと思って実際にパッと作成できた時、
プログラミングの力があるって本当に便利で、
今回のような1行程度の簡単な知識でも人の役に立つことができるなと強く実感しました。
少しでも当サイトの内容をお役立て頂けると幸いです。

【約50件】総務系の改善事例/改善案を多角的にご紹介します【数年分】

0.はじめに

総務系のみなさま、こんにちは。
今回の記事では、私が今まで10年弱に渡り蓄えてきた
総務系改善の知識と経験を大放出します。
改善が進んでいない会社に適用していったら、数年はかかるボリュームです。
(私についてはこちらから。)

以下5つのカテゴリごとに解説していきます。

  • 経費削減
  • 業務効率化・改善
  • 電子化
  • 福利厚生・社内設備
  • その他

「業務改善ネタがほしい」「次の評価どうしようかな…」という方、
ぜひ自社に当てはめて想像しつつ、参考にしてみてください。

1.経費削減

電力会社の変更
大規模かつ継続的な削減効果があります。
1000名規模の工場系の会社で年間約900万円の削減を行ったことがあります。
シンプルに試算して契約を切り替えるだけですが、
「設備変更」や「移行期間」の有無は注視してください。
移行期間の調整を失敗すると電気が来ないので、シャレになりません。
電力系の会社にいくつか連絡してみると、積極的に現費用との比較試算を出してくれます。
社用車ETCカードの変更
こちらも車両台数次第ですが、大規模かつ継続的な削減になります。
100台規模で年間300~500万円程度の削減になったかと記憶しています。
こちらは契約してから発行までに時間を要する場合がありますので、
現契約との移行をスムーズに行うために必ず移行計画を立てましょう。
電力と同様、いくつかの発行元に連絡して試算してもらいましょう。
社用携帯の契約変更
固定電話契約の見直し
社用携帯の台数が多い場合は大きな効果が出ます。
端末料金と月額料金とも、ボリュームディスカウントをしてもらいましょう。
また社用ですから不必要に高スペックな端末も不要なはずで、スペックを落としましょう。
固定電話についても、不要な回線がないか今一度見直しましょう。
IP電話やクラウドPBXなど電話の方式によってもコストが変わってきます。
尚、固定電話については営業日以外で移行するなどの注意が必要です。
賃料削減
こちらも規模感が大きく、都心ビルだと月次一千万単位の削減すら可能な場合があります。
ですが、相手側として値引きに応じるメリットが少ない場合も多く、
その分対応が長期化して工数を取られる傾向も強いです。精神的負荷もあります。
大人しく経費削減コンサルに相談するのがよい分野だと個人的には思います。
リース物件の費用交渉
複合機、プリンタのカウント料金交渉
これらはコツコツ聞いてくるパターンですね。
リース契約は月次のリース料、プリンタはカウント料金=印刷1枚あたりの使用料金がターゲットです。
契約期間は様々ですが、車両や複合機や厨房機器のリースだと初度契約で5年、
産業機械などでは10年という物もあります。
一度変更してしまえば長期的に効果が継続する点が非常に良いですね。
これについては相見積もりを取って交渉するのが一般的でしょう。
「弊社の契約を全て御社に回したら月額いくらになりますか?」という風に
顧客を取りたい新規業者さんに見積を依頼して、比較してみてください。
また、必要以上に印刷スピードの速い複合機はスペックを落としましょう。
出張旅費の削減
緊急で決まった海外出張の場合、エリアと時期によってはハイグレードな席しか取れず
往復費用が100万円を超えてくる場合もあります。
1社メインで取引する旅行会社の他に、2~3社ほど専属になりたい旅行会社も開拓しておき
いざと言う時に個人旅行やツアープランのキャンセル分を拾ってもらえるような体制があると
「チケット取れない」というリスクヘッジと経費削減を同時に実現する事ができます。
ここに関わる業務を行うと、日々コツコツと数千円~数万円の削減を実施できますが、
1社専属の工数的メリットも大きいため、社内で相談しましょう。
また、社内の出張旅費規程がガバガバの場合、そこに手を入れるのも良いでしょう。
廃棄物契約の変更
産廃の排出がある場合、地味に効果が出ます。
「プラは1kgあたり60円、木材は再資源化できるから無料、一般廃棄物は月額」など、
品目や業者によってコストの形態が異なります。
基本的には重量当たりの処理費用を相見積もりで交渉するのが良いでしょう。
ただし地域によっては、人付き合いや関係性が重視される業界特性もあるため、
処分業者、運搬業者、自社の3当事者の関係性に傷を付けない慎重さが必要です。
また処分業者が悪さをすると排出事業者も責任を問われるため、
選定の際には廃掃法を今一度確認して処分場の見学を行いましょう。
見学、面白いですよ。
ゴミ分別方法の変更
前項が長いので分けました。
もし社内での分別が本来行うべき分別と異なっていた場合、
処分単価が高額な品目に誤って分別してしまっている可能性があります。
社内の分別を正して社会的にもコスト的にも良い事をできる場合があります。
実際に「布」や「混合物」の分別を正して、年間約10万円の削減を行った事があります。
日常消耗品の購入先変更
様々なところから購入できるので迷いどころではありますが、
企業を相手に大量の仕入れをして安く提供する事務用品屋が世の中にはあります。
インターネットでの購入でもかなり安くなる場合がありますが、
1社繋がりを持っておくと特定品目でコツコツ削減出来る場合があります。
また、いざ物が無くて困った時にも緊急で助けてもらえる場合があります。
非常用備蓄品の変更
こちらについては数量次第です。
かなり手厚く考えてくれる会社の場合、数量が大きくなるため
ネット等で購入せず業者に直接依頼する方が安上がりに済む場合があります。
逆にここの費用を絞る会社や、人数が少ない企業の場合、
拠点数が多く1拠点辺りの数量が少ない場合、Amazon等で買った方が安くなる傾向にあります。
また購入する物品についても細かく選定する事で、経費削減が図れるでしょう。
電灯のLED化
もう古いのが付いている会社は無いでしょうか?
これについては今の拠点を出るまでの期間で試算をしてみてください。
本体費用に加えて、交換頻度や交換工数も試算に含めましょう。
ちなみに非LEDはあと数年で流通が無くなる見込みですので、
本体価格や入手難易度も上がっていきます。
環境配慮など様々な面でも交換へのアピールポイントがありますから、
加えて結果的に削減できたコストも評価ポイントとしてアピールしていきましょう。
日々の値引き交渉
当たり前ですがこれです。
そして、色々な担当者を見ていて、よ~~~く思う事があります。
「ちゃんと削減額を算出して、都度記録してください。」
ここ、ないがしろにする人がめちゃくちゃ多いんですが、やりましょう。
「評価のために、がめついなあ」と思う方も居られるかもしれません。が。
「会社のコストの事も常に視野に入れながらコストセンターになりがちな自覚を持って仕事をする」
という優秀なバックオフィス社員に必要な行動だと思います。意識が勝手に身に沁みつきます。
評価されるかは会社によるとは思いますが、やって損になる事は無いと思います。

2.業務効率化・改善

物品整理/清掃
「何だそんなことか」と思うなかれ。
物品の置き場を全てマッピングして、全員分の探す時間を削減したらどうでしょうか。
書籍貸出制度があるとして、在庫を全てリスト化し電子で貸出対応可能にしたらどうでしょうか。
清掃業者を入れて清潔にすることで従業員の健康が増進したら素晴らしいですよね。
かなり大きな改善で、多くの人に感謝される仕事です。
工数を使わせてもらえるよう、実施するメリットをアピールしましょう。
社内申請/依頼の電子化
丸々次項で解説します。
印刷工数や保管工数、探す工数、床面積≒賃料などでメリットが出ます。
定期集計の自動化
定期配信の自動化
毎月集計するもの、毎月配信するものなどについては自動化しましょう。
RPAやプログラム、タスクスケジューラを活用することで実現可能です。
私自身もこの辺りは大量に実装しており、自動化端末が毎日勝手に動いてくれています。
尚、実行が失敗した時に必ず検知できるようなエラー処理を仕込むことが重要です。
githubなどを使ってソース管理もできると更に良いと思います。
期間管理の自動化
リース満了の3ヶ月前に通知したい、入社/退職の日に対象者へ自動連絡したい。
期間や期日などに合わせてほぼ定型の対応が必要な場合、自動化しやすいです。
建物や什器などの契約更新時は価格交渉のチャンスですから、
知らぬ間に自動更新されぬようにキャッチできるように仕組みを組んでおきましょう。
人事データ等の自動日次取得
バックオフィスに所属していると、従業員情報を参照する機会は日常的にあると思います。
そんな時、毎回毎回人事管理システムにログインするのは面倒ですよね。
深夜帯等にRPA等を使って日次でExcelやスプレッドシートに自動で落とし込ませておくと、
関数等で加工もし易い形式のため様々なシーンで活用でき、後から地味に効いてきます。
社内配信のテンプレート化
社内掲示のテンプレート化
配信や掲示は毎回内容こそ違えど、テンプレート化しておくと良いでしょう。
毎回ゼロから作るよりは圧倒的に工数が削減されます。
また見る側としてもフォーマットが固定化されると分かりやすくなります。
RPA活用/その他社用ツール開発
既に各項目で触れていますが、これができるかどうかでかなり会社が変わります。
自分たちの会社独自の仕事を自動化することで、パッケージソフトでは実現できないような
圧倒的なパフォーマンスを出すことができます。
以前、月次で発生する数千件の手作業を自動化した事があります。毎月気が狂いそうでした。
実際に社内で動いている効率化プログラムが全部無くなったら・・・恐ろしいです。
冗談抜きで倍ぐらいの人材がバックオフィスに必要になると思います。

既にプログラマが社内に居るなら協力関係を構築すること自体も評価されるべきです。
自分でやるしか無い状況の場合、おそらく無数に効率化対象があるはずです。
学習は大変かもしれませんが、仕事で実践しながら身に着けていくと楽しいと思いますよ。

3.電子化

電子稟議の導入
保管性/検索性/運搬性/高速性・・・移行メリットは多分にあります。
が、このプロジェクトは難航するケースが多い印象です。
ワークフローシステムの初期費用は勿論のこと、仕様も多種多様です。
稟議と経費申請を連携可能なもの、経路設定が柔軟なもの、マスタ管理が楽なもの、
書式設定が簡単なもの・・・色々とありすぎて挫折しそうになります。

選定の際には「外部連携性」「経路管理」「書式管理」「従業員設定」「通知機能」辺りに特に着目し、
自社に必要な部分を持つツールを選定し「費用感」と照らし合わせると良いでしょう。
時には自社の業務方法を曲げる必要性もあるかもしれません。

電子印/電子契約サービスの導入
保管性/検索性/運搬性/高速性・・・電子稟議と同等のメリットがあります。
また契約満了日を管理・通知してくれるシステム等もあるため、
仕事の精度にも効果をもたらしてくれます。
ただし取引先の傾向によっては電子契約を受け入れてくれない場合もありますので、
自社取引先のカラーを考慮に入れて慎重に導入を決める必要があるでしょう。
社内規程管理システムの導入
保管性や参照性は勿論のこと、Word等で管理するよりも
フォーマット管理を気にしなくて良い点、変更履歴参照が容易な点などで優位性があります。
大量の機能を必要とする性質でも無いと思うので、社内にプログラマが居る場合は
購入せず内製化するのも一つの手だと思います。
勤怠システムの導入
集計作業や給与業務の効率にも直結します。
非常に操作性の良いシステムも多く、ユーザが楽になる場合もあるかと思います。
検討の際には、入社者情報の取込方法や、勤務実績の出力方法、各フォーマットなどを確認し、
自社の業務フローに対して問題が無いかしっかり確認してください。
運用者への立場を考慮できる開発者は意外と少なく、それがそのまま仕様になっている事が結構あります。
人事管理システムの導入
人の情報をマスタ管理できるシステムです。
COMPANYや人事奉行など「人事管理システム」と呼ばれるものです。
入社時に履歴書の情報や個人情報などを登録し、異動履歴や保有資格等も管理できます。
管理できる情報はシステムによって様々ですが、これ1つあれば履歴書等を引っ張り出す必要もなく
人の情報をエクセル等で管理している場合はこれ1つに集約できます。
ただし勤怠管理や給与管理などに大きな影響を及ぼすため、各種の業務フローとの調整を慎重に考慮しましょう。
社内申請/依頼の電子化
紙申請を電子化するのは勿論のこと、
ワード等をメールで提出するような業務についても改善できるかもしれません。
当サイトでも扱っていますが、Googleフォーム等にプログラムを仕込んで申請してもらう事で
word文書の細かなフォーマット修正などが不要になります。
対象が多くなってきた場合、プログラムをライブラリ化し管理シートを用意するなど
規模感に合った管理方法を工夫するとより良いと思います。
会議資料/議事録の電子化
web会議ツールの導入
これに関しては時代が時代なので、特に言及する事もないですね。
ガンガンやっていきましょう。
電話受付/受付タブレットの導入
来客受付担当者の人件費をカットできます。設備費用も大してかかりません。
対人受付の廃止に抵抗のある会社の場合、人件費の削減試算だけでは提案が通らない事もあると思います。
電話/タブレットでありながらも来訪者に対して失礼の無い具体的運用と共に提案すると良いでしょう。
タブレット受付ではチャットツール等に通知を飛ばしてくれる物もあります。
部門単位のチャンネルに通知するなどの方法を取り、見逃しても周囲の人がカバー可能な仕組みを作りましょう。

4.福利厚生・社内設備

社員食堂の導入/食堂業者の変更
かなり大変なイメージがありますよね。ですが全社を巻き込んだ面白い取組になる事もあります。
社員食堂の選定の際は複数の食堂業者を試食する事になると思います。
私の経験では、複数社を同日に集めて各部署代表者を巻き込んだ試食会を実施した事があります。
今思えば、これも福利厚生と言えそうですし、エンゲージメントにも繋がると思います。
ただ味だけではなく、従業員が支払う費用感もかなり重要になってきます。
なるべく負担増にならぬよう、場合によっては会社が一部負担するような形も検討してください。
業者によっては飲食費用は会社から支払、後から給与天引きとなるケースもあります。

大変なプロジェクトではありますが、従業員アンケート等を取ると
社員食堂を希望する声は非常に多く上がります。声を聞くところから始めるのも良いかもしれませんね。

弁当屋の導入
社員食堂の導入は場所や設備の問題で難しい、という場合も多いでしょう。
そんな場合でも、従業員規模によってはお弁当屋さんと連携できるケースがあります。
午前中に社員から注文を集めるスタイルや、販売員さんに社内に来てもらうスタイル、
アプリで注文するフードデリバリーの会社版のようなサービスもあります。
会社が費用を負担せずに導入可能な場合もありますが、これは業者さんによります。
注意点としては、バリエーションを増やすために多くの業者さんと提携すると
1社あたりの食数が少なくなり、値上げや撤退となるケースがあります。
トラブルにならぬよう、業者が増える場合等は正直に既存業者さんと情報共有すると上手に付き合えます。
また、食品の取扱いに関する申請手続等をきちんと行う会社なのかどうか、 過去に食中毒等の発生事例がないか、等もチェックすると、社会的リスクの観点で安心です。
社内カフェ/社内バーの導入
よく見る事例ですね。
仕事の合間のリフレッシュとしてコーヒーが嬉しい人は多く、ヘビーユーザーが付く印象です。
また業務後に社内バーでコミュニケーション促進を行う会社もありますね。
いずれの場合も、行う内容によっては衛生関連の資格や許可が必要になる場合があり、
事前にかなり入念に調べておく必要はあります。
しかし、実際に様々に経験し従業員の声を聞くと、それだけの価値はありそうです。
カフェ運営が難しくても、個人では買いにくいコーヒーメーカーを社内に検討することは容易です。
最近では、こういった社内施設を運営してくれる業者さんもあります。
ウォーターサーバー/給茶機の導入
外回りの社員や、ランチ時など、社内にあると嬉しいですよね。
飲料を汲んでいる際に他部署社員とのコミュニケーションが発生するような効果もあります。
いくつか契約形態があり、事前に料金形態や納品形態を比較できると良いでしょう。
ウォーターサーバーの場合、水道直結、タンク式、ボトル式があります。
本体買切、レンタル、ボトルで利益を出すパターン、辺りが主流です。
ボトルの場合は納品頻度や使用量によっては場所をかなり取るため注意が必要です。
給茶機の場合も概ね同様です。本体無料の場合でも大抵は粉末代やコップ代がかかります。
気付いたら思わぬ金額の消耗品費が積み重なる場合もあるため、
運用開始後も定期的に長期試算をしましょう。
リフレッシュスペース/フリースペースの導入
「休憩時間に1人で過ごしたい」「自席から離れて過ごしたい」
そんな従業員も結構多く居るものです。
休憩時間の質を上げることが結果として業務品質に繋がる場合もあります。
経営者の考え方次第ですが、通りそうな場合は提案だけでもしておくと数年後に実現するかもしれません。
作業ブース/電話ブースの導入
「周囲の声が電話に入る」「周囲がうるさく集中できない」等に応える事ができます。
電話ブースは高品質な物を導入すると1つ数十万円します。
消火面や放送面など防火上の配慮等も必要になる場合があるので少しハードルは高いかもしれません。
権限者の方に、実際に効果を体感してもらいましょう。特に営業品質面を実感してもらうと良いでしょう。
運用ルールや予約方法なども、検討段階である程度固めておいた方が良いでしょう。
また、簡易的な仕切りブースとも効果と費用感を比較してみると良いでしょう。
パウダールームの設置
パウダールームとまで行かなくても、女性トイレへの配慮はあると喜ばれます。
拠点設計の際にはぜひ検討してください。導入後、必ず社員から反応があるはずです。
トイレの個室を多めに作る
人数に対して合っていないと、休憩時間など行列ができてしまう場合があります。
これも拠点設計の際に、過去実績から検討しましょう。
トイレの混雑緩和
上記と同様ですが、仕組みを導入する事で解消している事例があります。
社員の秩序によって効果の程は異なりますが、トイレセンサー等のサービスがあります。
混雑状況や入室時間を取得しているという状況が抑止力になり、結果的に改善されるというものです。
しかしこればかりは試してみないと効果が分からない部分もありますので、
1フロアだけから始めてみる、等のミニマムスタートで実験してみてください。
尚、賃貸ビルの場合は勝手に設置すると怒られる場合があるため貸主に事前確認してくださいね。
エレベーターの混雑緩和
これも解消すると非常にありがたいですよね。
初級編としては、エレベータの設定で待機階を利用が多い階に変更してみましょう。
エレベータの業者さんにお願いすれば短時間で変更してくれます。
基本的に階段を使うルール等も世の中にはありますが、不便ですよね。
奇策としては「EV内の床に線を引く」等の事例があります。
思わず線の中に収まるように立つ、という効果があるようです。
コロナ渦の商業施設で見かけた仕組みとよく似ていますね。
コストがかかりにくい工夫から試してみてください。
社内動線の再設計
設備配置など、少しの事でも従業員のストレスが減ります。
私の場合、給茶機の向きを90度変更しただけで食堂の動線が大きく改善した事があります。
また、こうした小さな事を実績としてPRできると、この職種に必要な「気付き力」を主張できます。
ちょっとした事ですが、管理者の立場から見てもこういう事に気付ける人は本当に重宝します。
各種設備の日常メンテナンス
当たり前の事ですが、従業員の満足度に直結します。
電子レンジの庫内や上、ウォーターサーバーの口や受け皿、衛生的ですか?
また設備の機能低下についても積極的に修理の提案をしていきましょう。
細かく対応件数があればあるほど、値引き交渉実績を積むチャンスも増えます。
清掃サービスの導入
従業員が朝や夕方に清掃する、という会社も少なくないと思います。
それも頭の切り替えになって良いかもしれませんが、不満を持つ社員も居るかもしれません。
また清掃の質は担保できないため、社風次第では清掃業者に置き換えても良いでしょう。
オフィス清掃の業者を探すと、清掃のプロとして実施してくれる業者さんが出てきますが、
家事代行サービス等も検討範囲に入れるとより視野が広がります。
清掃のプロの品質は高いですが、コストがかかります。
日常清掃は家事代行サービスを使い、定期的にカーペットクリーニング等を清掃業者に依頼するなど
うまく使い分けることでコストを抑えて運用できます。
社用備品の充実
ペンや文房具や電池など、社内で使用する物品は会社支給で完結できた方が無難です。
社長の観点では「ちょっとした事」ですが、自己負担を良く思わない社員は多いです。
また、電源延長コードなど一時貸出できると利便や可能性が増進する物は導入しましょう。
PCモニタを複数台利用可能に
プログラムや設計図を扱う専門職の方は非常に喜びます。
また、マウスやキーボードも一定金額内で好みの物を使わせた方が、効率とエンゲージメントが上がります。
アンケートを取って、また対象部門の役職者を味方に付けて、アピールしましょう。
保養施設の導入
年会費等がかかるイメージですが、社会保険機関や加入団体が実はサービスを持っている場合もあります。
現加入団体に付帯サービスが無いかチェックしてみてください。
主に宿泊施設について、1泊あたり数千円の割引が受けられる印象です。
ただ社風や申込方法によっては利用者数が伸びない場合もあるため、
なるべく会社を通さずに申込できるような制度設計ができると双方気楽に運用できます。
割引系の福利厚生サービスの導入
保養施設に近いです。加入する事で社員が飲食店やレジャーの割引を受けられます。
リロクラブやベネフィットステーションなど、一度検索してみてください。
社員の年齢層によって向き不向きはあると思います。

5.その他

補助金
国の補助金を取ってきましょう。
過去にはITツールの購入補助金や、エコ関係、コロナ関係などがありました。
申請難易度は時によって異なりますが、購入補助系は比較的楽なイメージがあります。
自分から情報を探さないと誰も教えてくれないので、定期的に検索しましょう。
チャットツールの導入
社風次第ですが、最近ではOffice365やGoogleWorkspace等の契約に含まれる場合もあり
比較的容易に導入できるようになってきていますね。
メールより気軽に、即時的に連絡が取れる点が魅力です。
またナレッジ共有用のチャンネルや部活用のチャンネル等をルールに従って運用する会社もあります。
業務での自動通知をチャットツールに流す事例等もネットに大量に流れており、
業務改善への可能性も広く開かれています。
メンバー教育/鼓舞
正直ここに書く事なのか迷いましたが、一応。
雰囲気を改善したり、レベルを底上げする事も重要な組織改善です。
率先して動く姿勢を見せる、積極的に発言する姿勢を見せる、等もやれそうであればやっていきましょう。
大きなテーマなので、別記事で触れられそうであれば触れていきます。
改善プロジェクトをやる
後輩や同僚を巻き込みましょう。
「色々改善案は持ってるから、MTGして紹介するよ。大変な部分は全部自分がやるから一緒にやって2人の実績にしよう」
と誘ってください。何回もやってますが、一度も断られた試しがありません。
もちろん、リードする必要はあります。この記事を見ながらリードしてください。
改善の思考方法や背中を自然と見せる事ができ、評価にも直結します。良い事しかありません。

6.この記事の活用方法について

項目数が50もあるため大変かもしれませんが、
自社で未実施の項目があればぜひ検討材料にしてください。
「自社状況に当てはめると、どうなるだろう」とシミュレーションしたり、
また同僚に共有したり記事を見ながらブレインストーミングをしても面白い場になると思います。

7.さいごに

本稿では網羅的にご紹介することを目標に、
事例の概略と検討時に考慮すべき事を大まかに記載しました。

他にも改善の際に助けとなる心構えや周囲の巻き込み方、
評価への上手な繋げ方などポイントとなる部分は沢山あります。
それぞれが重要なテーマになりますので、また別の機会にご紹介できればと思います。

また、この中に無いような改善対応があればぜひ教えてください!
私自身も思いつき次第、この記事は随時更新しようと思います。

それではまた別の記事でもお会いできる事を楽しみにしています。
ありがとうございました。

サルでも分かる Amazon商品URL短縮ボタンを3分で作る方法

1.はじめに

AmazonのURL、長くないですか?
スプレッドシートにAmazonの長すぎるURLが張ってあったとき、
「短縮してよ~」と思いながら自分で全部直したりしませんか?

この記事ではURLを一瞬で作るボタンを自作します。
周りの人のブラウザにも仕込んで使い方を教るとあなたが快適になります。
誰でも簡単に作成できますので、お気軽にどうぞ。

2.やり方

2-1.ブラウザのブックマーク設定を開く

Chromeの場合、ブラウザ右上の・・・ボタンから
「ブックマーク>ブックマークマネージャ」を開きます。
ブラウザのブックマークマネージャを開く

2-2.ブックマークの新規追加を選択

ブックマークマネージャ内の・・・から
新規追加を選択します。
ブックマークの新規追加

2-3.プログラム文字列を登録

下記の文字列を入力して保存してください。
これで完成です!

javascript:(function(){
s = "https://amazon.co.jp/dp/" + location.href.match(/(?<=\/)([A-Z0-9]{10,})(?=\/|\?|$)/)[0];
location.href = s; })();

3.実行してみる

商品ページでブックマークボタンを押すと
Amazonの商品ページ上で、先ほど追加したブックマークを押すと・・・

URLが短縮されます
はい、URLが短縮されました!

ブックマークが常時表示されておらず常時表示したい方は、
ブラウザの表示設定を変更してくださいね。
ブックマークを常時表示する

4.プログラムの中身について

4-1.概略

今回行った事は、こういう事です。

ブックマーク押下時に、
予めブックマーク登録した「プログラム」を実行する。

 

そして、そのプログラムの中身の概要はこうです。

「javascript」というプログラミング言語で
現在開いているページのURLを読み込み
「正規表現」という方法を使ってURLを分割。
必要な部分だけを抽出し
URLバーにその部分を貼り付ける。

です。

4-2.少しだけ細かく解説

まず、押すとjavascriptという言語でプログラムを実行します。

javascript:(function(){

URLから商品固有のコードを抜き出し(正規表現)
※正規表現の説明は非常に長くなるので省略します。

location.href.match(/(?<=\/)([A-Z0-9]{10,})(?=\/|\?|$)/)[0]

固定URL(https~dp/)と結合し、sという箱に入れます。

s = "https://amazon.co.jp/dp/" + location.href.match(/(?<=\/)([A-Z0-9]{10,})(?=\/|\?|$)/)[0];/* Your code... */

現在のページ(location)をsの中身にします。

location.href = s;

5.活用方法

5-1.購買系実務で使ってもらう

Amazonを利用したり参照するケースが多い企業の場合、
社内ポータル等に方法を書いておいても良さそうです。

5-2.JavaScript教育の導入とする

今回の方法以外にも、ブックマークレットにJavaScriptを登録して動きを見せましょう。
「web上の要素取得」「ボタンを押す」等が分かりやすいと思います。
そしてそれらの動きを見せましょう。一発でJavaScriptの動きに実感が湧くと思います。

「今回はURL短縮したけど、実はこんなのもできる。
 例えばこれ、ボタンを押すプログラムが仕込んである。
 これをクリックすると・・・ほら。
 こういうプログラムが、画面上のボタンとかに全部仕込まれてるんだよ。
 web画面ってそういう風にできてるんだ。」

という風な具合でしょうか。
結構お手軽で、学習前の人の興味を引くにはいいと思うんですけどね。

6.さいごに

はい。いかがでしたでしょうか。

私の場合、仕事でAmazonをよく使っていた時期がありました。
URLを周囲の方々へ送る時、申請書に記載する時、
スプレッドシートにまとめる時などによく活用していましたね。
簡単なので、周囲メンバーのPCにも設定して回っていました。

ぜひ活用して、広めてみてください。
少しでもお役に立てれば幸いです。ありがとうございました。

AIチャットボットにGASを書いてもらったら実用レベルで絶望した件

0.はじめに

0-0.ごあいさつ

こんにちは!
今回はちょっとおふざけ回「AIにコード書かせてみた」です。
実際に実務で書いてきたようなコードを、AIに書いてもらいました。

「AIによってプログラマは不要に」なんて説も聞こえてくる昨今ですが
果たして人気AIサービスの実力や如何に。

0-1.使用するAIチャットボットについて

2023年1月現在、話題沸騰のChatGPTを使っていきます。
ChatGPT公式
「平気で嘘ついてくる」等の評価もありますが、
はたして日常業務アプリのコーディングの場合はどうでしょうか。

1.Googleフォーム自動回答

最初の設問はこちら。

googleフォーム回答があった際に自動的にメールを送信するGASコードを書いてください。

 

chatGPT選手の回答コードはこちら!

function sendEmail(e) {
  var email = "youremail@example.com"; // Change to your email address
  var subject = "New Response to Google Form";
  var body = "A new response was submitted to the Google Form.\n\n";
  for (var i = 0; i < e.values.length; i++) {
    body += e.namedValues[Object.keys(e.namedValues)[i]].toString() + "\n";
  }
  MailApp.sendEmail(email, subject, body);
}
/**chatGPTがこのコードを書いてくれた後に付属していた補足コメント This code uses the sendEmail method from the MailApp class to send an email with a specified subject and body. The body of the email contains all the responses submitted in the Google Form. To use this code, create a new Google Apps Script project, paste the code into the script editor, and save the project. Then, go to the Google Form, click on the "Responses" tab, and select "Get pre-filled URL." This will open the form with sample data filled in. Click the "Submit" button to trigger the function and send an email.*/

いかがでしょうか。
パッと見、よく書けているように思いますが
私の環境ではエラーを吐きましたw
e.valuesが不正、とのことですが本論から逸れるので省きます。

constやletを使用しないところや、
for文の中身が少し冗長なのが気になりますが

動かなかったことは別として、要望通りの方向性でコードを書けていることは分かります。

ただ、当然のことですが
必ずしも動くものが返ってくるわけではない
ということは念頭に置いておく必要がありそうですね。

2.スプレッドシート更新時通知

次の設問はこちら。

スプレッドシートの最終行にデータが入った際に自動で
その入力された内容をメール送信するGASを書いてください

 

chatGPT選手の回答コードはこちら!

function sendInvoiceEmail() {
    // Get the active spreadsheet and the last row
    var sheet = SpreadsheetApp.getActiveSheet();
    var lastRow = sheet.getLastRow();
    
    // Get the values of the last row in an array
    var rowValues = sheet.getRange(lastRow, 1, 1, sheet.getLastColumn()).getValues()[0];
    
    // Assign the values to variables for use in the email
    var date = rowValues[0];
    var invoiceNum = rowValues[1];
    var clientName = rowValues[2];
    var description = rowValues[3];
    var quantity = rowValues[4];
    var rate = rowValues[5];
    var amount = rowValues[6];
    
    // Create the email subject and body
    var subject = "Invoice #" + invoiceNum + " for " + clientName;
    var body = "Dear " + clientName + ",<br><br>" + 
               "Please find attached the invoice for " + description + " with the following details:<br>" + 
               "<b>Date:</b> " + date + "<br>" + 
               "<b>Invoice #:</b> " + invoiceNum + "<br>" + 
               "<b>Description:</b> " + description + "<br>" + 
               "<b>Quantity:</b> " + quantity + "<br>" + 
               "<b>Rate:</b> " + rate + "<br>" + 
               "<b>Amount:</b> " + amount + "<br><br>" + 
               "Thank you for your business!<br><br>" + 
               "Best regards,<br>Your Name";
    
    // Send the email
    MailApp.sendEmail(clientEmail, subject, body, {htmlBody: body});
    }
    /**
     * chatGPTがコードを書いた後に残してくれた補足
     Note: This example assumes that you have a column with the client's email address
           in the spreadsheet, and that you have set the variable clientEmail
           to the appropriate email address in the script.

           You can run this script by selecting Run > sendInvoiceEmail in the
           Google Apps Script editor, or by setting a trigger to run the script
           automatically whenever a new row is added to the spreadsheet.
     */

はい。いかがでしょうか。
実はこの設問の前に、興味本位で別の質問をしておりまして、
「スプレッドシートを使って請求書のフォーマットを作成してください。」
というやり取りがあったからか、前提が請求系SSになっちゃってます。

このコードも一応使えそうですね。
特に指定していないのにbタグで「日付」「ナンバー」などを太字にするなど、
見やすさにも配慮が届いたコードになっています。

ありがたい気遣いですね。

3. 1000件ある社内のGoogleグループを全件管理するシート作って!

3-1.質問側に問題があるパターン

次の設問はこちら。

所属するドメインのGoogleグループのメールアドレスとエイリアスと名称を全件取得して
スプレッドシートに貼り付けるGASを書いてください。
グループの総数は約1000件あり、増加しても問題ないコードにしてください。

 

chatGPT選手の回答コードはこちら!

function getGroupInfo() {
    // Get the active spreadsheet and the last row
    var sheet = SpreadsheetApp.getActiveSheet();
    
    // Clear the existing data in the spreadsheet
    sheet.clearContents();
    
    // Get all the Google Groups in the domain
    var groups = GroupsApp.getGroups();
    
    // Create an array to store the group information
    var groupData = [];
    
    // Loop through each group and get the group email, alias, and name
    for (var i = 0; i < groups.length; i++) {
      var group = groups[i];
      var email = group.getEmail();
      var alias = group.getAliases().join(', ');
      var name = group.getName();
      
      // Add the group information to the array
      groupData.push([email, alias, name]);
    }
    
    // Paste the group information into the spreadsheet
    sheet.getRange(1, 1, groupData.length, groupData[0].length).setValues(groupData);
  }
/** chatGPTがコードの後に残してくれた補足
You can run this script by selecting Run > getGroupInfo in the Google Apps Script editor.
This script will retrieve all the Google Groups in the domain and
paste their email addresses, aliases, and names into the active Google Sheets spreadsheet,
starting from the first row.
*/  

意図と異なる回答が返ってきてしまいましたね。
自身が入っていないものも含め、社内のグループ全件を対象としたかったのですが、
このコードでは、自身のアカウントだけが所属しているGoogleグループ一覧を作成しています。
ただ、「日本語という言語の壁が大きい」という話もよく耳にします。
ということで、質問の仕方を変えてみました。

3-2.質問の仕方を工夫してみた

設問はこちら。

AdminDirectoryを使用して社内のGoogleグループのメールアドレスとエイリアスと名称を
全件取得してスプレッドシートに貼り付けるGASを書いてください。
グループの総数は約1000件あり、増加しても問題ないコードにしてください。

 

chatGPT選手の回答コードはこちら!

function getGroupInfo() {
    // Get the active spreadsheet and the last row
    var sheet = SpreadsheetApp.getActiveSheet();
    
    // Clear the existing data in the spreadsheet
    sheet.clearContents();
    
    // Get the domain for which you want to retrieve the groups
    var domain = 'your_domain.com';
    
    // Create a new AdminDirectory API service
    var service = AdminDirectory.Groups.list({domain: domain});
    
    // Get all the Google Groups in the domain
    var groups = [];
    do {
      var response = service.execute();
      groups = groups.concat(response.groups);
      service.maxResults = response.nextPageToken;
    } while (response.nextPageToken);
    
    // Create an array to store the group information
    var groupData = [];
    
    // Loop through each group and get the group email, alias, and name
    for (var i = 0; i < groups.length; i++) {
      var group = groups[i];
      var email = group.email;
      var alias = group.aliases.join(', ');
      var name = group.name;
      
      // Add the group information to the array
      groupData.push([email, alias, name]);
    }
    
    // Paste the group information into the spreadsheet
    sheet.getRange(1, 1, groupData.length, groupData[0].length).setValues(groupData);
  }
/**
ChatGPTがコードの後に残してくれた補足
You can run this script by selecting Run > getGroupInfo in the Google Apps Script editor.
This script will retrieve all the Google Groups in the domain and
paste their email addresses, aliases, and names into the active Google Sheets spreadsheet,
starting from the first row. Note that you need to replace 'your_domain.com'
with your actual domain name. Additionally, you need to grant the script
the necessary permissions to access the AdminDirectory API by going to
File > Project properties > Add-ons and enabling the Google Admin SDK API.
*/  

いかがでしょうか。これは素晴らしいのではないでしょうか。
検証してませんが、多分動くと思います。
最初にclearContentsが入っているあたり、
このスクリプトでデータを何度も上書きすることをちゃんと想定していますね。

4.pivotGroupのSortBy()の使い方を教えて!

設問はこちら。
GASでシート上ピボットテーブルの並び順を変えたい時に質問したものです。

GASのpivotgroupクラスに対するsortBy(value, oppositeGroupValues)メソッドを使ってカスタムソートする方法が分かりません。
どうやって使うか具体例を出して解説してください。

 

chatGPT選手の回答はこちら!

//GASのpivotgroupクラスのsortBy()メソッドを使用すると、ピボットテーブルの特定の値に基づいてグループを並べ替えることができます。
//sortBy()メソッドには、次の2つの引数が必要です。

//value - グループを並べ替えるために使用する値の列の見出し(必須)
//oppositeGroupValues - value列で並べ替えたい値のリスト(オプション)
//以下は、具体的な例として、pivotgroupクラスのsortBy()メソッドを使用してピボットテーブルのグループを並べ替える方法を示します。

//例として、以下のような売上データのピボットテーブルがあるとします。
//	A	B	C
//1	商品	地域	売上合計
//2	商品A	東京	1000
//3	商品A	大阪	2000
//4	商品B	東京	3000
//5	商品B	大阪	4000
//このテーブルを、地域別に売上合計で並べ替えたい場合を考えます。この場合、sortBy()メソッドを使用して、売上合計列を並べ替えることができます。
//以下のスクリプトは、上記のピボットテーブルを読み込み、地域別に売上合計で並べ替えます。
function customSort() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');
  var pivotTable = sheet.getPivotTables()[0];
  var group = pivotTable.getRowGroup(1); // 地域のグループ
  var sortByColumn = pivotTable.getValues()[0].indexOf('売上合計') + 1; // 売上合計の列の番号
  group.sortBy(sortByColumn);
}

//上記の例では、sortBy()メソージを使用して、value引数に渡す列の見出しを売上合計として取得し、
//oppositeGroupValues引数を省略して、デフォルトの昇順ソートを実行しています。

このコード、確実に動きません!

なぜならpivotGroupクラス.getValues()なんてメソッドは存在しないからです。

ということで、設問を追加してみます。

GASにpivotGroup.getValues()っていうメソッド、ないよね?

 

対してchatGPT。


//はい、申し訳ありません。
//先程の回答において、getValues()というメソッドが存在するかのように誤った情報を提供してしまいました。
//実際には、PivotGroupクラスにはgetValues()メソッドは存在しません。
//正しい情報を提供するために、修正版の回答を再度提供いたします。

function customSort() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');
  var pivotTable = sheet.getPivotTables()[0];
  var group = pivotTable.getRowGroup(1); // 地域のグループ
  var dataRange = pivotTable.getDataRange();
  var values = dataRange.getValues();
  var sortByColumn = values[0].indexOf('売上合計') + 1; // 売上合計の列の番号
  var oppositeGroupValues = ['大阪', '東京']; // 逆順で並べ替えたい地域
  group.sortBy(sortByColumn, oppositeGroupValues);
}

//この修正版の回答では、PivotTableクラスにはgetValues()メソッドは存在しないことを正確に反映しています。
//代わりに、getDataRange()メソッドを使用して、ピボットテーブルのデータ範囲を取得し、
//getValues()メソッドを使用して、そのデータ範囲のすべての値を取得することができます。
//お手数をおかけして申し訳ありませんでした。

うん、pivotGroup.getDataRange()も存在しねーから!

「嘘ばっかやんけ!」と言いたくなりますが、更に聞いてみます。

pivotGroupクラスにはgetDataRangeってメソッドも無いよね。

続いてchatGPT。


//申し訳ありません、私の前回の回答に誤りがありました。
//PivotGroupクラスには、getDataRange()というメソッドは存在しません。
//正しい情報を提供するために、修正版の回答を提供いたします。
function customSort() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');
  var pivotTable = sheet.getPivotTables()[0];
  var group = pivotTable.getRowGroup(1); // 地域のグループ
  var pivotValues = group.getValues(); // グループの値を取得
  var sortByColumn = pivotTable.getValues()[0].indexOf('売上合計') + 1; // 売上合計の列の番号
  var oppositeGroupValues = ['大阪', '東京']; // 逆順で並べ替えたい地域

//~~~~まだ回答は続いてますが以下略。

ということで、最初に「無いよ」と指摘した「getValues」を使う嘘回答にループしました。

実務が絡んでいたので、この後も根気良く工夫して質問しました。
色々な出口を潰す質問方法だったり、実際のテーブル構造をどうにか伝えたり。
結果、chatGPTを用いての解決には至りませんでした。
自分で工夫してピボットテーブルの構造を変更してソート用の数値データ列を持ち昇順ソートで解決しました。

ちなみにsortByメソッドでのカスタムソート方法は公式以外の情報が落ちておらず、
GPTなら、と思いましたが、謎の存在しないメソッドを提案してくる始末でした。

5.まとめ

初めての検証企画でしたが、いかがでしたでしょうか。

実は最後の設問、私がGASを学び始めてifとforしか分からない時に
苦労して悩みながら何とか解決したテーマなんです。思い出深い。
(ifとforだけで頑張ってる方はこちらの記事も見てみてください。)

最後の事例では、上手く使わないとチャットのやり取りに時間を奪われるだけでした。
chatGPTに対して「それ間違ってる!」と訴え続ける時間は何とも価値の低い時間でした。
また、質問している視点に回答も自分の思考も縛られてくるので、
「あれ、そもそもカスタムソートしなくても解決できるやん?」
という風な別視点での問題解決への気付きを失いやすいなと感じました。
人間の思考停止への道がここにあるなと感じさせられました。

まだまだな部分もありますが、コード間のコメントなど配慮がきいている部分も多々あり、
「苦労して書いたコードが数秒で・・・」と絶望する方もおられるかもしれませんね。
私としては「適切性のために不合理を選択する」等の点で人間捨てたもんじゃないと思いますが、
皆さんはいかがでしょうか。

もしよろしければコメントで頂けると嬉しいです。ありがとうございました!