@@ -0,0 +1,362 @@
// 宛名印刷&住所録 テスト用データ
/*
1000001 ◯◯県◯◯市◯◯◯◯◯,1丁目2−3 ◯山 ◯太郎 様,◯子 様 2000001 ◯◯県◯◯市◯◯ 1丁目2−3,◯◯アパート◯◯◯号室 ◯村 ◯郎
1000002 ◯◯◯県◯◯◯市◯◯◯,2丁目3−4 ◯木 ◯男 様 2000001 ◯◯県◯◯市◯◯ 1丁目2−3,◯◯アパート◯◯◯号室 ◯村 ◯郎
1000003 ◯◯県◯◯◯郡◯◯◯◯,3丁目4−5 ◯村 ◯一 様,◯◯美 様 2000001 ◯◯県◯◯市◯◯ 1丁目2−3,◯◯アパート◯◯◯号室 ◯村 ◯郎
*/
// はがきのシートの設定
function setHagakiSheet ( ) {
var margin_left = 1 ; // 左側の余白
var margin_top = 47 ; // 上側の余白
var rate_v = 1 ; // 縦方向の比率
var rate_h = 1 ; // 横方向の比率
var ss = SpreadsheetApp . getActiveSpreadsheet ( ) ; // 現在のスプレッドシートを取得
var sheet = ss . getSheets ( ) [ 0 ] ; // はがきのシートを取得
sheet . setName ( 'はがき' ) ; // シートの名前を設定
// 横方向のサイズを設定
// 差出人郵便番号
var sender_post_width = 30 * rate_h ; // 各桁の幅
var sender_post_margin = 6 * rate_h ; // 3桁目と4桁目の間の幅
// 宛先郵便番号
var dest_post_margin_left = 72 * rate_h ; // 左側間隔
var dest_post_width_1 = 48 * rate_h ; // 1〜3桁の幅
var dest_post_width_2 = 47 * rate_h ; // 4〜7桁の幅
var dest_post_margin_1 = 5 * rate_h ; // 各桁の間の幅
var dest_post_margin_2 = 8 * rate_h ; // 3桁目と4桁目の間の幅
// 列幅指定配列
var col_width = [
margin_left , // 左側の余白
sender_post_width , // 差出人郵便番号 1桁目
sender_post_width , // 2桁目
sender_post_width , // 3桁目
sender_post_margin , // 間隔
sender_post_width , // 4桁目
sender_post_width , // 5桁目
sender_post_width , // 6桁目
sender_post_width , // 7桁目
dest_post_margin_left , // 宛先郵便番号 左の間隔
dest_post_width_1 , // 1桁目
dest_post_margin_1 , // 間隔1
dest_post_width_1 , // 2桁目
dest_post_margin_1 , // 間隔1
dest_post_width_1 , // 3桁目
dest_post_margin_2 , // 間隔2
dest_post_width_2 , // 4桁目
dest_post_margin_1 , // 間隔1
dest_post_width_2 , // 5桁目
dest_post_margin_1 , // 間隔1
dest_post_width_2 , // 6桁目
dest_post_margin_1 , // 間隔1
dest_post_width_2 // 7桁目
] ;
for ( var i = 0 ; i < col_width . length ; i ++ ) {
sheet . setColumnWidth ( i + 1 , col_width [ i ] ) ; // 列幅を設定
}
// 縦方向サイズ設定
// 宛先郵便番号
var dest_post_height = 66 * rate_v ; // 郵便番号蘭の高さ
// 差出人郵便番号
var sender_post_margin_top1 = 280 * rate_v ; // 切手等の高さ
var sender_post_margin_top2 = 522 * rate_v ; // 差出人入力蘭の高さ
var sender_post_height = 54 * rate_v ; // 郵便番号蘭の高さ
// 縦方向サイズ設定
var row_height = [
margin_top , // 上側の余白
dest_post_height , // 宛先郵便番号蘭の高さ
sender_post_margin_top1 , // 切手等の高さ
sender_post_margin_top2 , // 差出人入力蘭の高さ
sender_post_height // 差出人郵便番号蘭の高さ
] ;
for ( var i = 0 ; i < row_height . length ; i ++ ) {
sheet . setRowHeight ( i + 1 , row_height [ i ] ) ; // 行の高さを設定
}
// セルの結合
sheet . getRange ( 'B4:I4' ) . merge ( ) ; // 差出人
sheet . getRange ( 'J3:O4' ) . merge ( ) ; // 宛名
sheet . getRange ( 'P3:W4' ) . merge ( ) ; // 宛先住所
var range ;
// セルの文字寄せ
range = sheet . getRange ( 'A1:W5' ) ; // 範囲選択
range . setHorizontalAlignment ( 'center' ) ; // 選択肢:left, center, right
range . setVerticalAlignment ( 'middle' ) ; // 選択肢:top, middle, bottom
// フォントの指定
try {
range . setFontFamily ( 'MS Gothic' ) ;
} catch ( e ) { }
// フォントサイズ
sheet . getRange ( 'K2:W2' ) . setFontSize ( 36 * rate_v ) ; // 宛先郵便番号
sheet . getRange ( 'B5:I5' ) . setFontSize ( 22 * rate_v ) ; // 差出人郵便番号
sheet . getRange ( 'B4' ) . setFontSize ( 18 * rate_v ) ; // 差出人
sheet . getRange ( 'J3' ) . setFontSize ( 48 * rate_v ) ; // 宛名
sheet . getRange ( 'P3' ) . setFontSize ( 30 * rate_v ) ; // 宛先住所
}
// 住所録のシートの設定
function setJyushoSheet ( ) {
var ss = SpreadsheetApp . getActiveSpreadsheet ( ) ; // 現在のスプレッドシートを取得
if ( ss . getNumSheets ( ) !== 1 ) { // 現在のシート数が1の場合
return ;
}
var sheet = ss . insertSheet ( '住所録' ) ;
var cell ;
// 列ラベル設定
sheet . getRange ( 1 , 1 ) . setValue ( '宛先郵便番号' ) ; // 宛先郵便番号
sheet . getRange ( 1 , 2 ) . setValue ( '宛先住所' ) ; // 宛先住所
sheet . getRange ( 1 , 3 ) . setValue ( '宛名' ) ; // 宛名
sheet . getRange ( 1 , 4 ) . setValue ( '差出人郵便番号' ) ; // 差出し人郵便番号
sheet . getRange ( 1 , 5 ) . setValue ( '差出人住所' ) ; // 差出人住所
sheet . getRange ( 1 , 6 ) . setValue ( '差出人' ) ; // 差出人
// 列幅
sheet . setColumnWidth ( 1 , 110 ) ; // 宛先郵便番号
sheet . setColumnWidth ( 2 , 350 ) ; // 宛先住所
sheet . setColumnWidth ( 3 , 350 ) ; // 宛名
sheet . setColumnWidth ( 4 , 110 ) ; // 差出し人郵便番号
sheet . setColumnWidth ( 5 , 350 ) ; // 差出人住所
sheet . setColumnWidth ( 6 , 350 ) ; // 差出人
// 文字寄せ・背景色
var range = sheet . getRange ( 'A1:F1' ) ;
range . setHorizontalAlignment ( 'center' ) ; // 選択肢:left, center, right
range . setBackground ( '#cfe2f3' ) ; // #efefef
}
// シートの設定
function setSheets ( ) {
setHagakiSheet ( ) ; // はがきのシートの設定
setJyushoSheet ( ) ; // 住所録のシートの設定
}
// シートの値を全削除
function clearSheet ( ) {
SpreadsheetApp . getActiveSpreadsheet ( ) . getActiveSheet ( ) . clearContents ( ) ; // アクティブシートの値を削除
}
// 文字数チェック
function checkText ( row ) {
var ss = SpreadsheetApp . getActiveSpreadsheet ( ) ; // 現在のスプレッドシートを取得
var sheet_h = ss . getSheetByName ( 'はがき' ) ; // はがきのシートを取得
var sheet_j = ss . getSheetByName ( '住所録' ) ; // 住所録のシートを取得
var text ;
var rows ;
var message = "" ;
// 宛先住所 16文字
text = String ( sheet_j . getRange ( row , 2 ) . getValue ( ) ) ;
rows = text . split ( ',' ) ;
for ( var i = 0 ; i < rows . length ; i ++ ) {
if ( rows [ i ] . length > 16 ) {
message = "宛先住所" ;
break ;
}
}
// 宛名 10文字
text = String ( sheet_j . getRange ( row , 3 ) . getValue ( ) ) ;
rows = text . split ( ',' ) ;
for ( var i = 0 ; i < rows . length ; i ++ ) {
if ( rows [ i ] . length > 10 ) {
if ( message . length !== 0 ) message += ", " ;
message = "宛名" ;
break ;
}
}
// 差出人住所 16文字
text = String ( sheet_j . getRange ( row , 5 ) . getValue ( ) ) ;
rows = text . split ( ',' ) ;
for ( var i = 0 ; i < rows . length ; i ++ ) {
if ( rows [ i ] . length > 16 ) {
if ( message . length !== 0 ) message += ", " ;
message = "差出人住所" ;
break ;
}
}
// 差出人
text = String ( sheet_j . getRange ( row , 6 ) . getValue ( ) ) ;
rows = text . split ( ',' ) ;
for ( var i = 0 ; i < rows . length ; i ++ ) {
if ( rows [ i ] . length > 16 ) {
if ( message . length !== 0 ) message += ", " ;
message = "差出人" ;
break ;
}
}
// 文字数がオーバーしている場合、メッセージを表示
if ( message . length !== 0 ) {
SpreadsheetApp . getUi ( ) . alert ( String ( row ) + "行目の『" + message + "』が文字数オーバーです。\n処理を中断します。" ) ;
return false ;
}
return true ;
}
// 住所録の現在の行を宛名表示
function setCurrentRow ( ) {
var ss = SpreadsheetApp . getActiveSpreadsheet ( ) ; // 現在のスプレッドシートを取得
var sheet_h = ss . getSheetByName ( 'はがき' ) ; // はがきのシートを取得
var sheet_j = ss . getSheetByName ( '住所録' ) ; // 住所録のシートを取得
if ( ss . getActiveSheet ( ) . getName ( ) !== '住所録' ) { // 住所録のシートを開いていない場合
ss . setActiveSheet ( sheet_j ) ; // 住所録のシートを表示
} else {
var row = sheet_j . getActiveCell ( ) . getRow ( ) ; // 選択中の行を取得
if ( checkText ( row ) === false ) {
return ;
}
setText ( row ) ; // 宛名を入力
ss . setActiveSheet ( sheet_h ) ; // はがきのシートを表示
}
}
// 出力用のファイルを作成
function exportSheets ( ) {
var ss = SpreadsheetApp . getActiveSpreadsheet ( ) ; // 現在のスプレッドシートを取得
var sheet_h = ss . getSheetByName ( 'はがき' ) ; // はがきのシートを取得
var sheet_j = ss . getSheetByName ( '住所録' ) ; // 住所録のシートを取得
// 住所録のデータ数を取得
var range = sheet_j . getDataRange ( ) ; // データのある範囲
// 文字数オーバーの確認
for ( var i = 2 ; i <= range . getNumRows ( ) ; i ++ ) {
if ( checkText ( i ) === false ) {
return ;
}
}
var new_ss = SpreadsheetApp . create ( '宛名印刷_出力' ) ; // 名前を付けてスプレッドシートを作成
sheet_h . clearContents ( ) ; // はがきシートの値をクリア
var text ;
for ( var i = 2 ; i <= range . getNumRows ( ) ; i ++ ) {
if ( checkText ( i ) === false ) {
return ;
}
setText ( i ) ; // 宛名を入力
sheet_h . copyTo ( new_ss ) ; // はがきシートをコピー
// シート名を変更
text = String ( sheet_j . getRange ( i , 3 ) . getValue ( ) ) ; // シート名を"(番号)_(宛名先頭3文字)"にする
new_ss . getSheets ( ) [ new_ss . getNumSheets ( ) - 1 ] . setName ( String ( i - 1 ) + '_' + text . substr ( 0 , 3 ) ) ;
}
new_ss . getSheets ( ) [ 0 ] . activate ( ) ; // シート1をアクティブにする
new_ss . deleteActiveSheet ( ) ; // アクティブシートを削除
}
// 文字列を縦書きに変換
function convText ( rows , max_length ) {
var result ;
if ( max_length === 0 ) { // 最大文字数の指定がない場合(宛名部分)
// 最大文字数を取得
for ( var i = 0 ; i < rows . length ; i ++ ) {
if ( rows [ i ] . length > max_length ) {
max_length = rows [ i ] . length ;
}
}
// 行頭に空白文字を追加し、文字数を揃える
for ( var i = 0 ; i < rows . length ; i ++ ) {
for ( var j = rows [ i ] . length ; j < max_length ; j ++ ) {
rows [ i ] = ' ' + rows [ i ] ;
}
}
} else { // 最大文字数の指定がある場合(宛先、差出人住所部分)
// 1行目:末尾に空白文字を追加し、文字数を揃える
for ( var i = rows [ 0 ] . length ; i < max_length ; i ++ ) {
rows [ 0 ] += ' ' ;
}
// 2行目以降:行頭に空白文字を追加し、文字数を揃える
for ( var i = 1 ; i < rows . length ; i ++ ) {
for ( var j = rows [ i ] . length ; j < max_length ; j ++ ) {
rows [ i ] = ' ' + rows [ i ] ;
}
}
}
// 文字列を縦書きに変換
result = '' ; // 変換結果を代入
for ( var i = 0 ; i < max_length ; i ++ ) {
result += rows [ rows . length - 1 ] . substr ( i , 1 ) ; // 一文字ずつ加える
for ( var j = rows . length - 2 ; j >= 0 ; j -- ) { // 縦書きの左の行から結果に加える
result += ' ' + rows [ j ] . substr ( i , 1 ) ; // 縦書きの行間に半角スペースを入れる
}
if ( i < max_length - 1 ) {
result += '\n' ; // 改行する
}
}
return result ;
}
// はがきに宛名を書き込む
function setText ( row ) {
var ss = SpreadsheetApp . getActiveSpreadsheet ( ) ; // 現在のスプレッドシートを取得
var sheet_h = ss . getSheetByName ( 'はがき' ) ; // はがきのシートを取得
var sheet_j = ss . getSheetByName ( '住所録' ) ; // 住所録のシートを取得
var text ;
var result ;
var rows ;
// 宛先郵便番号
text = String ( sheet_j . getRange ( row , 1 ) . getValue ( ) ) ;
for ( var i = 0 ; i < 7 ; i ++ ) {
sheet_h . getRange ( 2 , 11 + i * 2 ) . setValue ( text . substr ( i , 1 ) ) ;
}
// 宛先住所 16文字
text = String ( sheet_j . getRange ( row , 2 ) . getValue ( ) ) ;
text = text . replace ( / − | ー / g, '|' ) ;
rows = text . split ( ',' ) ;
sheet_h . getRange ( 'P3' ) . setValue ( convText ( rows , 16 ) ) ;
// 宛名 10文字
text = String ( sheet_j . getRange ( row , 3 ) . getValue ( ) ) ;
rows = text . split ( ',' ) ;
sheet_h . getRange ( 'J3' ) . setValue ( convText ( rows , 0 ) ) ;
// 差出人郵便番号
text = String ( sheet_j . getRange ( row , 4 ) . getValue ( ) ) ;
for ( var i = 0 ; i < 3 ; i ++ ) {
sheet_h . getRange ( 5 , 2 + i ) . setValue ( text . substr ( i , 1 ) ) ;
}
for ( var i = 0 ; i < 4 ; i ++ ) {
sheet_h . getRange ( 5 , 6 + i ) . setValue ( text . substr ( i + 3 , 1 ) ) ;
}
// 差出人住所 16文字
rows = [ ] ;
text = String ( sheet_j . getRange ( row , 5 ) . getValue ( ) ) ;
text = text . replace ( / − | ー / g, '|' ) ;
text = text . split ( ',' ) ;
for ( var i = 0 ; i < text . length ; i ++ ) {
rows . push ( text [ i ] ) ;
}
// 差出人
text = String ( sheet_j . getRange ( row , 6 ) . getValue ( ) ) ;
text = text . split ( ',' ) ;
for ( var i = 0 ; i < text . length ; i ++ ) {
rows . push ( text [ i ] ) ;
}
sheet_h . getRange ( 'B4' ) . setValue ( convText ( rows , 16 ) ) ;
}
// 起動時処理:スプレッドシートのメニューに追加
function onOpen ( event ) {
var ss = SpreadsheetApp . getActiveSpreadsheet ( ) ;
var menu = [ { name : '宛名印刷ファイルに出力' , functionName : 'exportSheets' } ,
{ name : '現在の行の宛名書きを表示' , functionName : 'setCurrentRow' } ,
{ name : 'はがきシートをクリア' , functionName : 'clearSheet' } ,
{ name : 'はがき・住所録シート作成' , functionName : 'setSheets' } ,
] ;
ss . addMenu ( '宛名印刷' , menu ) ; // メニューを追加
}