指定年月のカレンダーを作成する(ブロックレイアウト)

■プログラム説明(ソースコード説明)
 変数YYが年、変数MMが作成するカレンダーの月になります。月は実際よりも1少ない値にする必要があります。これはDateオブジェクトのsetMonth()メソッドが実際の月よりも1少ない値を指定する必要があるためです。月によって31日だったり30日だったりするため、月末日を配列loopに入れておき月に応じて生成する日にちの長さを決めます。ただし、2月の閏年の処理は行っていません。日にちのまわりに枠を描きますが、枠や文字を表示する位置は曜日によって決定します。曜日は0〜6の値で返されるため、枠の横幅に曜日の値を乗算することにより表示位置を求めることができます。土曜日、日曜日の場合は枠の色を別途指定し青色と赤色にします。土曜日の場合にはY座標をずらします。最終日までこの処理を繰り替えすとカレンダーが作成されます。

■ソースコード
YY = 2005; // 年数
MM = 0; // 月は実際より1少ない値にする
youbi = ["(日)","(月)","(火)","(水)","(木)","(金)","(土)"];
loop = [31,29,31,30,31,30,31,31,30,31,30,31];
sx = 40; // 表示開始位置
y = 750; // 表示終了位置
boxW = 60; // 枠の横幅
boxH = 60; // 枠の縦幅
dx = boxW + 5; // 横移動量
dy = -boxH - 5; // 縦移動量
fSize = 20; // 文字サイズ
black = new RGBColor();
black.red = black.green = black.blue = 0;
red = new RGBColor();
red.red = 255;red.green = red.blue = 0;
blue = new RGBColor();
blue.red = blue.green = 0; blue.blue = 255;

docObj = documents.add();
for (i=0; i<loop[MM]; i++)
{
tmpObj = new Date(YY,MM,i+1);
tmpDD = tmpObj.getDate();
tmpYB = tmpObj.getDay();
x = sx + tmpYB * dx; // 表示位置計算
drawBorder(x,y,tmpYB);
addText(x+55,y-26,tmpDD);
if (tmpYB == 6) y = y + dy;
}

// 枠を描画
function drawBorder(x,y,yb)
{
pathObj = docObj.pathItems.rectangle(0,0,boxW,boxH);
pathObj.translate(x,y);
pathObj.filled = false;
pathObj.stroked = true;
pathObj.strokeWidth = 3;
pathObj.strokeColor = black;
if (tmpYB == 0) pathObj.strokeColor = red; // 日曜日は赤
if (tmpYB == 6) pathObj.strokeColor = blue; // 土曜日は青
}

// テキストを追加
function addText(x,y,srcText)
{
textObj = docObj.textFrames.add();
textObj.contents = srcText;
textObj.translate(x,y);
textRng = textObj.textRange;
textRng.size = fSize;
textRng.paragraphs[0].justification = Justification.RIGHT;
}


■使い方
1:カレンダーを作成するドキュメントをアクティブ(最前面)にします。
2:ファイルメニューからスクリプトを実行します。
3:指定年月日のカレンダーが作成されます。


■ポイント
 forで繰り返す回数を365日にすると1年分のカレンダーが作成できます。
 閏年の処理は行っていません。このため2月は常に29日まで表示されます。閏年の処理を行いたい場合には以下の命令を使って処理できます。

if (((theYear__ % 4 == 0) && (theYear__ % 100 != 0)) || (theYear__ % 400 == 0))
{
閏年の処理
}

■実際のスクリプトをダウンロード(sample.js.zip)