昨日の続きになりますが、今日はスクリプトの具体的な記述になりますので、
興味の無い方はパスしてくださっても構いませんが最後の文章のみご確認ください。
ちなみに、この文章はFaceBookにも転送されていますが、FaceBookでは図が表示されておりませんので
タイトルのリンクをクリックしてブログから閲覧願えれば幸いです。
<2011-07-16 スクリプトを全面更新しました。>
実際のタイムカードの画面には、下記図の様に、A・B列に担当者コードと名前を
隠しております。表示しております。

セル"D7"の式には、"=vlookup(D5,A2:B30,2,false)"を埋め込み、名前を表示させるようにしておきます。
セル"E1"の式には "=day(D1)"
セル"F1"の式には "=hour(D1)& ":" & minute(D1)"
セル"E7"の式には "=year(D1)"
セル"F7"の式には "=month(D1)"
をそれぞれ埋め込みます。これは、スクリプトで利用しやすいようにする為に記述しています。
スクリプトは[ツール][スクリプトエディタ]で作成します。
スクリプトは以下の様になります。
// *********************************************
// * クラウドタイムカード Ver1.1 *
// *********************************************
// Author : OO-com.inc T.Oka
// 履歴
// 2011.07.13 Ver1.0 デリバリー
// 2011.07.16 Ver1.1 運用開始、複数の人が同時に処理できるように排他処理を行った。
// 出勤時、社員名の背景色を水色に退勤時はグレーにする。
// その他の対応細かい対応
//
//
// ******************************************************************************
//出勤ボタンを押したとき出勤の背景色を赤くする
function myBackColor() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sted = "ST"
var Sno = fncGetSheetNo("入力")
var sheet = ss.getSheets()[Sno];
var Tan = sheet.getRange("D5").getValue(); //Ver1.1 他の人が使用中かどうかチェックする
if (Tan != ""){
Browser.msgBox("他の人が使用中です! しばらくお待ちください。");
return;
}
var cell= sheet.getRange("E8");
cell.setBackgroundColor("RED"); //"E8"の背景色を赤に
cell= sheet.getRange("F8");
cell.setBackgroundColor("White"); //"E9"の背景色を白に
cell= sheet.getRange("E4");
cell.setValue(sted); // "E4"に"ST"をセットし出勤状態をKeep
var value = Browser.inputBox("社員コードを入力してください:");
if (value != "cancel"){ //Ver1.1 キャンセルの対応を行った。
sheet.getRange("D5").setValue(value);
}
}
// ******************************************************************************
//退勤ボタンを押したとき退勤の背景色を赤くする
function myBackColor2() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sted = "ED"
var Sno = fncGetSheetNo("入力")
var sheet = ss.getSheets()[Sno];
var Tan = sheet.getRange("D5").getValue(); //Ver1.1 他の人が使用中かどうかチェックする
if (Tan != ""){
Browser.msgBox("他の人が使用中です! しばらくお待ちください。");
return;
}
var cell= sheet.getRange("E8");
cell.setBackgroundColor("White");
cell= sheet.getRange("F8");
cell.setBackgroundColor("RED");
cell= sheet.getRange("E4");
cell.setValue(sted); // "E4"に"ED"をセットし退勤状態をKeep
var value = Browser.inputBox("社員コードを入力してください:");
if (value != "cancel"){ //Ver1.1 キャンセルの対応を行った。
sheet.getRange("D5").setValue(value);
}
}
// ******************************************************************************
//確認ボタンを押したときの処理
function myGetTime() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var Sno = fncGetSheetNo("入力")
var sheet = ss.getSheets()[Sno];
var Tvalue = sheet.getRange("D5").getValue();
// 社員コードのチェック
if (Tvalue == ""){
Browser.msgBox("エラー:社員が入力されていません!");
return;
}
// 出勤か退勤かの判断を行い時刻をセットする。
var cell = sheet.getRange("E4");
var sted = cell.getValue()
var cell = sheet.getRange("F1");
var setTime = cell.getValue()
sheet.getRange(9,5,1,2).clearContent(); // 出退勤時間範囲のクリア
if (sted == "ST")
{
sheet.getRange("E9").setValue(setTime);
}
else
{
sheet.getRange("F9").setValue(setTime);
}
// 社員のシート処理
var TanName = "担当" + Tvalue
var No0 = fncGetSheetNo(TanName)
if (No0 == null) { // Ver1.1 nullの対応
sheet.getRange(5,4,1,1).clearContent(); // Ver1.1 社員コードのクリア
return("");
}
var sheet2 = ss.getSheets()[No0];
// 社員のシートでカンレンダーのチェック
var kiNisuu = sheet2.getRange("O1").getValue();
var wkDay = sheet.getRange("E1").getValue();
var wkYear = sheet.getRange("E7").getValue();
var wkMonth = sheet.getRange("F7").getValue();
if (wkDay > 15) {
sheet2.getRange("A1").setValue(wkYear);
sheet2.getRange("B1").setValue(wkMonth); // 15日以上の時は年月をセットする
var nisuu = wkDay - 15 + 2;
}
else {
var nisuu = wkDay + 17 - kiNisuu + 2; // 31 30 29 28 日の対応
}
if (sted == "ST") {
sheet2.getRange(nisuu,4).setValue(setTime);
}
else
{
sheet2.getRange(nisuu,5).setValue(setTime);
var STtime =sheet2.getRange(nisuu,4).getValue();
sheet.getRange("E9").setValue(STtime);
}
var Gyosuu = setTan() // 社員名に色づけ処理
sheet.getRange(5,4,1,1).clearContent(); // Ver1.1 社員コードのクリア
}
// ******************************************************************************
// シート名からシートNoを求める関数
function fncGetSheetNo(inName) {
var sheet2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(inName);
if (sheet2 != null) {
return(sheet2.getIndex() - 1);
}
else
{
Browser.msgBox("エラー:シート名が見つかりません");
return(null); // Ver1.1 return("")にすると親プロセスに戻らず終了していたので
} // null に変更した。
}
// ******************************************************************************
// 社員コードから社員に出退勤の色をつける Ver1.1より
function setTan() {
var Tansuu = 30; // ★社員を30人に固定している
var ss = SpreadsheetApp.getActiveSpreadsheet();
var Sno = fncGetSheetNo("入力");
var sheet = ss.getSheets()[Sno];
var Tvalue = sheet.getRange("D5").getValue(); // 社員コード
var sted = sheet.getRange("E4").getValue(); // 出勤か退勤かの判断
// 社員コードの一致する行を検索
for (var i = 2; i < (Tansuu + 1); ++i) { // 2行目から社員MAXまで
var tancd = sheet.getRange(i,1,1,1).getValue(); // A列の社員コードをtancdにセット
if (tancd == Tvalue) {
var cell= sheet.getRange(i,1,1,2); // A・B列を選択して
if (sted == "ST") { //出勤か退勤か
cell.setBackgroundColor("aqua"); //"E8"の背景色を水色(aqua)に
}
else
{
cell.setBackgroundColor("gray"); //"E8"の背景色を灰色(gray)に
}
return(i);
}
if (tancd == "") {
Browser.msgBox("エラー:担当者が見つかりません");
return("");
}
}
}
--------------------------------------------------------------------------------------
前提条件として下記の図のようなシートを担当者コード別に用意しておく事にしています。
担当者コードを入力しておくだけなので直ぐに用意できます。

また図形やボタンにスクリプトを割り当てるには、下記の図の様に表示して割り当てます。

まだまだ、改良の余地は沢山ありますがサンプルですので、ご容赦願います。
ちなみにiPhone やandroid携帯ではPCモードの表示がされないようですので利用できません。
最後まで読んで頂きました方、ありがとうございます。是非このブログのタイトルの下、テーマの右にあります[いいね!]ボタンを押してください。
また、ご要望・ご意見のある方、または、お試しになりたい方はこちらからのホームページ
からご連絡をお願い致します。
「iPadを利用したスプレッドシートの活用の件」と内容も入れてくださいますようお願い致します。
http://www.oo-com.com/contact.php