-
-
Save tamx/c2528f49c3ae526c7b4bbd342a1ddeae to your computer and use it in GitHub Desktop.
Googleスプレッドシート_宛名印刷
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 宛名印刷&住所録 テスト用データ | |
/* | |
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() { | |
var ss = SpreadsheetApp.getActiveSpreadsheet(); // 現在のスプレッドシートを取得 | |
var sheet_h = ss.getSheetByName('はがき'); // はがきのシートを取得 | |
sheet_h.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 convDouble(str) { | |
var result = str.replace(/[A-Za-z0-9]/g, function(s) { | |
return String.fromCharCode(s.charCodeAt(0) + 0xFEE0); | |
}); | |
result = result.replace(/ /g, " "); | |
result = result.replace(/-/g, "|"); | |
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()); | |
text = convDouble(text); | |
if ("ー-|".indexOf(text.substr(3,1)) != -1) { | |
text = text.substr(0,3) + text.substr(4,4); | |
} | |
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 = convDouble(text); | |
text = text.replace(/−|ー/g, '|'); | |
rows = text.split(','); | |
sheet_h.getRange('P3').setValue(convText(rows, 16)); | |
// 宛名 10文字 | |
text = String(sheet_j.getRange(row, 3).getValue()); | |
text = convDouble(text); | |
rows = text.split(','); | |
sheet_h.getRange('J3').setValue(convText(rows, 0)); | |
// 差出人郵便番号 | |
text = String(sheet_j.getRange(row, 4).getValue()); | |
text = convDouble(text); | |
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 = convDouble(text); | |
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 = convDouble(text); | |
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); // メニューを追加 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment