質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

2回答

455閲覧

Google Apps Scriptで、出張修理の集計を行いたいのですが・・・

kimizo

総合スコア0

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

0グッド

0クリップ

投稿2021/05/17 12:27

全くの初心者ですが、皆様方のお知恵を拝借したく、書き込みさせていただきます。
会社で、以下のような出張修理の集計を毎月行っており、それを自動化できないかと
考えております。

(毎日記録する出動状況)

出動日担当者業務内容
5/15山本部品交換
5/15野中機材整備
5/15大滝機材搬送
5/16山本部品交換
5/17谷川機材整備
5/15大滝部品交換

(上記出動状況を、担当者別に集計)
5月分集計
山本 出動回数 5回 部品交換:2回 機材整備:3回
野中 出動回数 8回 部品交換:1回 機材整備:4回 機材搬送:3回

実際には担当者が30人ほどと多く、業務内容が6種類あるため、なかなか集計が面倒なのです・・・。

Google Apps Scriptで、素早く間違いなく集計を行うには、どのようにしたらよろしいのでしょう? どなた様かご教授いただければ幸いに存じます。何卒宜しくお願い申し上げます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hope_mucci

2021/05/17 14:29

このような集計はピボットテーブルを使うと簡単に実現できますが、GASで実現しなければならない理由が存在するのでしょうか。 ExcelでもGoogleスプレッドシートでもピボットテーブルは作成可能です。
kimizo

2021/05/17 15:06

お返事ありがとうございます。全くもっておっしゃるとおりで、これまで私がピボットテーブルで、集計作業をしておりました。ところが、このたび私が外勤中心の勤務を命じられ、他の人に事務仕事を引き継ぐに当たり、簡単で確実に短時間で済むようにしてあげられないかと考えた次第です・・・。
hope_mucci

2021/05/17 15:25

手順書を作って引継ぎしたほうが絶対に良いです。 プログラムはメンテナンスが必要です。処理要件が変わった際に誰がGASのスクリプトを修正するのでしょうか?修正できる人がいませんよね。 ピボットテーブルを作成する手順をマニュアル化したほうが、何か修正しなければならなくなった際の作業ハードルは低いでしょう。
guest

回答2

0

Google Apps Scriptを使わず、またPivot Tableのような操作も不要
ということで、Query関数を使って、クロス集計をしてみたら良いのでは。

基本的にメンテナンス不要に出来ます。

参考:Query関数を使ってデータを集計しよう – 其の壱

投稿2021/05/20 11:47

officeforest

総合スコア412

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

僕も、hope_mucciさんの意見に賛同します。
項目が一つ増えたとか、部署も表示したいとか要望が増えたり、エラーで動かなくなったとkimizoさんに連絡がきて、なんだかんだと改修の仕事を振られます。

やるとしたらこんな感じかなと思います。
極力わかりやすい関数にしてますので、ちょっと長くなってます。

この内容で難しいと感じるようでしたら、編集や修正は難しいのでピポットテーブルをおすすめします!

gas

1function myfunc(){ 2var ss = SpreadsheetApp.openById('***');  //スプレッドシートの指定 3var sheet = ss.getSheetByName('***'); //シートの指定 4var values = sheet.getDataRange().getValues(); //集計したいデータを全取得 5 6 7//結果を入れる連想配列 8var results = {} 9 10//取得した全データを集計 11values.forEach(e =>{ 12  13 //タイトル行は無視 14 if(e[0]!="出動日"){ 15 16 var date = e[0] //出勤日 17 var name = e[1] //担当者名 18 var content = e[2] //作業内容 19 20 21 //結果に担当者の配列を確認  あれば出動日の回数を追加 22 if(!results[name]){ 23 results[name] ={attendance:0} 24 }else{ 25 results[name]["attendance"] +=1 26 } 27 28 29  //担当者配列の中に作業内容の値があるか確認 あれば回数を追加 30 if(!results[name][content]){ 31 results[name][content] = 1 32 }else{ 33 results[name][content] += 1 34 } 35 } 36 }) 37 38 var setValues = [] 39 var maxColumn = 0 40 41 //setValuesで貼り付ける際に2次元配列の長さが一致しないと貼れないので連想配列の最大の長さを調べる 42 Object.keys(results).forEach(e=>{ 43 if(maxColumn < Object.keys(results[e]).length+1){ 44 maxColumn = Object.keys(results[e]).length+1 45 } 46 }) 47 48 for(var key in results){ 49 //名前と出動回数を配列に入れる 50 var item = [[key],["出動日 "+results[key]["attendance"]+"回"]] 51 52  //連想配列の中のスタッフごとの値を連想配列から配列へ変更 53 for(var content in results[key]){ 54 if(content != "attendance"){ 55 item.push([content+": "+ results[key][content]+"回"]) 56 } 57 } 58 59 //setValuesで貼り付ける際に2次元配列の長さが一致しないと貼れないのでここで調整 60 var counter = maxColumn - item.length 61 for(var i = 1; i <=counter;i++ ){ 62 item.push("") 63 } 64 65 setValues.push(item) 66 } 67 68  69 var setSheet = ss.getSheetByName('***'); //貼り付け先のシートの指定 70 71 //貼り付け先シートのクリア 72 setSheet.clear(); 73 //貼り付け 74 setSheet.getRange(1,1,setValues.length,maxColumn).setValues(setValues) 75 76} 77

投稿2021/05/18 03:30

Tatsunosuke

総合スコア599

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問