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.

Revisions

  1. tamx revised this gist Nov 12, 2017. 1 changed file with 19 additions and 0 deletions.
    19 changes: 19 additions & 0 deletions gas_ss_atena.js
    Original file line number Diff line number Diff line change
    @@ -300,6 +300,16 @@ function convText(rows, max_length){
    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(); // 現在のスプレッドシートを取得
    @@ -311,23 +321,30 @@ function setText(row) {

    // 宛先郵便番号
    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));
    }
    @@ -338,13 +355,15 @@ function setText(row) {
    // 差出人住所 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]);
  2. tamx revised this gist Nov 12, 2017. 1 changed file with 3 additions and 1 deletion.
    4 changes: 3 additions & 1 deletion gas_ss_atena.js
    Original file line number Diff line number Diff line change
    @@ -143,7 +143,9 @@ function setSheets(){

    // シートの値を全削除
    function clearSheet() {
    SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().clearContents(); // アクティブシートの値を削除
    var ss = SpreadsheetApp.getActiveSpreadsheet(); // 現在のスプレッドシートを取得
    var sheet_h = ss.getSheetByName('はがき'); // はがきのシートを取得
    sheet_h.clearContents();
    }

    // 文字数チェック
  3. @githubmorley githubmorley created this gist Nov 5, 2016.
    362 changes: 362 additions & 0 deletions gas_ss_atena.js
    Original file line number Diff line number Diff line change
    @@ -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); // メニューを追加
    }