Google Apps Script 견적서에서 데이터를 전기하고 동일한 스프레드 시트에 송장 만들기

소개



이번은, 이쪽의 사양을 조금 변경한 버젼이 됩니다. 따라서 자세한 정보는 아래 링크를 참조하십시오.
Google Apps Script 견적서에서 데이터를 전기하고 지정된 폴더에 인보이스 만들기(스프레드시트)

변경된 점은 "송장을 저장할 위치를 지정된 폴더에서 동일한 스프레드시트에 넣었다"는 것입니다.

견적서 준비



이런 느낌의 견적서를 사용한다.
견적서의 데이터는 table 가운데, 그 위에는 상대방의 이름


송장 템플리 준비



이런 느낌의 청구서의 템플리를 사용한다.
이것이 복사되고 복사 된 스프레드 시트에 견적서의 테이블 데이터가 전기됩니다.
복사 된 송장은 동일한 스프레드 시트에 저장됩니다.



주의점



테이블의 행 수는 동일합니다.



견적서의 데이터가 들어 있는 table 의 행수와 송장의 템플리의 table 의 행수는, 같아야 한다.

이번 예에서는 견적서의 table 의 행수는 최대 10행 들어간다. 따라서 송장의 템플리트의 table 행 수는 최대 10 행입니다.

복사 원본 시트 이름을 변경하지 마십시오.



이 예에서는 "송장 템플릿"이라는 시트 이름이지만 복사 원본 시트를 가져올 때이 시트 이름을 사용하므로 변경하지 마십시오.



견적서에서 인보이스 작성



단번에 전부 싣습니다.

코드.gs
// Spreadsheetが開かれた時に自動的に実行されます.
function onOpen() {
  // 現在開いている、スプレッドシートを取得します.
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();

  // メニュー項目を定義します.
  var entries = [
    {name : "請求書を生成"  , functionName : "menuItem1"},
  ];
  // 「Custom」という名前でメニューに追加します.
  spreadsheet.addMenu("Custom", entries);
}


// menuItem1をクリックした時の処理
function menuItem1() {
  var data = getData();
  setData(data);
}


function getData() {
  //現在のスプレットシートを取得する
  var sheet1 = SpreadsheetApp.getActiveSheet();

  //table内の最終行を取る
  var lastRow = getLastRow();
  //見積書のtableはB7から始まる
  var stopGetCount = lastRow + 6;
  Logger.log(stopGetCount);

  //名前を取る
  var name = sheet1.getRange(2, 2).getValue();
  //最終金額を取る
  var finalTotal = getFinalTotal();
  Logger.log(finalTotal);

  //tableの開始B7から、lastRow行 + 6列
    var values = sheet1.getRange(7, 2, lastRow, 6).getValues();

  return [values, name, finalTotal];
}

function setData(data) {
  //現在のスプレッドシートを取得
 var ss = SpreadsheetApp.getActiveSpreadsheet();

  //同じスプレッドシート内にある「コピー元シート」をシート名で指定
  var source = ss.getSheetByName("請求書テンプレート");

  //  シートをコピー
  var newSheet = source.copyTo(ss);

  //今日の日付
  var today = new Date();
  var todayData = Utilities.formatDate(today, 'Asia/Tokyo', 'yyyy年 MM月 dd日');

  //見積書のtable内の最終行を取る
  var lastRow = getLastRow();
  //請求書のtableはB17から始まる
  var stopSetCount = lastRow + 16;
  Logger.log(stopSetCount);

  // 請求先の相手の名前を取得
   var fileName = '請求書(' + data[1] + ')';
  // コピーしたシート名を変更
  newSheet.setName(fileName);

   //データを転記
   //コピー先のシートの中のセルを指定して、コピー実行
  newSheet.getRange('B8').setValue(data[1]); //name
  newSheet.getRange('C12').setValue(data[2]); //finalTotal
  newSheet.getRange('H28').setValue(data[2]); //finalTotal
  newSheet.getRange('H2').setValue(todayData); //日付

  //dataの中のvaluesを取り出す
  var items = data[0];

  var j = 0;
  for(var i = 17; i <= stopSetCount; i++) {
    newSheet.getRange(i, 2).setValue(items[j][3]); //description
    newSheet.getRange(i, 5).setValue(items[j][1]); //qty
    newSheet.getRange(i, 7).setValue(items[j][4]); //unitPrice
    newSheet.getRange(i, 8).setValue(items[j][5]); //total 
    j++;
  }

  //作成シートにカーソルをフォーカス
  ss.setActiveSheet(newSheet);
}

//見積書のtableの最終行を取りたい
function getLastRow() {
 //現在のスプレッドシートを取得
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  //現在のシートを取得
  var sheet = spreadsheet.getActiveSheet();

  //B列7行目からの最終行を下方向に検索
  var lastRow = sheet.getRange(7, 2).getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow();
  //開始行は6固定。最終行の番号から開始行の番号を引くことで、table内の値が何行あるか判別
  var lastRowValue = lastRow - 6;

//もし10行以上入ってたら警告を出す
  if (lastRowValue > 10) {
  alert();
    return;
  }
  return lastRowValue;
}

//最終金額を取りたい
function getFinalTotal() {
  //現在のスプレットシートを取得する
  var sheet1 = SpreadsheetApp.getActiveSheet();
  //「Total(Include GST)」の文字列を探す
  var textFinder = sheet1.createTextFinder('Total(Include GST)');
  //検索結果に該当するセルを抽出
  var ranges = textFinder.findAll();
  //最終金額の左の文字、Total(Include GST)の位置を取る
  var textPos = ranges[0].getA1Notation();

  var textPosCell = sheet1.getRange(textPos);
  //Total(Include GST)の右隣のセルの値を取る
  var finalTotal = textPosCell.offset(0, 1).getValue();
  return finalTotal;
}

function alert() {
  var ui = SpreadsheetApp.getUi();
  var title = '見積書のデータが10行以上です';
  var text = '10行以上だと見た目が崩れるよ!'
  ui.alert(title, text, ui.ButtonSet.OK_CANCEL);
}

가볍게 해설



다음 링크를 참조하십시오. 거의 같은 코드이기 때문에
Google Apps Script 견적서에서 데이터를 전기하고 지정된 폴더에 인보이스 만들기(스프레드시트)

좋은 웹페이지 즐겨찾기