Skip to content

Instantly share code, notes, and snippets.

@tamx
Forked from githubmorley/gas_ss_atena.js
Last active January 2, 2020 16:42
Show Gist options
  • Save tamx/c2528f49c3ae526c7b4bbd342a1ddeae to your computer and use it in GitHub Desktop.
Save tamx/c2528f49c3ae526c7b4bbd342a1ddeae to your computer and use it in GitHub Desktop.
Googleスプレッドシート_宛名印刷
// 宛名印刷&住所録 テスト用データ
/*
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