// 宛名印刷&住所録 テスト用データ /* 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); // メニューを追加 }