ray88’s diary

お仕事で困ったとき用の自分用の覚書

GAS 読み取ったCSVの指定の項目をスプシの指定の列に書き出す

※関連関数
GAS ドライブのファイル情報を取得してスプレッドシートに書き出す - ray88’s diary
GAS ファイルURLからファイルIDを抽出する - ray88’s diary
GAS CSVを読み取る - ray88’s diary

/**
 * 任意のレコード配列(1件=オブジェクト)を、
 * 行固定・列バラバラ配置でシートに出力する共通関数(append版)。
 *
 * @param {number} startRow        見出し行の行番号(例: 1)
 * @param {Object[]} records       出力するデータ(1要素 = 1行のオブジェクト)
 * @param {Object[]} columns       列定義の配列
 *   - {string} header          見出し文字列
 *   - {string} key             records[i][key] で参照するプロパティ名
 *   - {number} col             シートの列番号 (1=A, 3=C…)
 *   - {function(any, Object): any} [formatter] 表示用に加工したい場合
 * @param {GoogleAppsScript.Spreadsheet.Sheet} [sheet]
 */
function writeRecordsSparseAppend(startRow, records, columns, sheet) {
  sheet = sheet || SpreadsheetApp.getActiveSheet();

  const headerRow    = startRow;
  const dataStartRow = headerRow + 1;

  const sheetLastRow = sheet.getLastRow();
  const writeStartRow = (sheetLastRow < dataStartRow)
    ? dataStartRow
    : sheetLastRow + 1;

  columns.forEach(colDef => {
    const col = colDef.col;

    // ヘッダー(必要なら)
    const headerCell = sheet.getRange(headerRow, col);
    if (headerCell.isBlank()) {
      headerCell.setValue(colDef.header);
    }

    const colValues = records.map(rec => {
      const raw = rec[colDef.key];
      const v = colDef.formatter ? colDef.formatter(raw, rec) : raw;
      return [v];
    });

    if (colValues.length > 0) {
      sheet
        .getRange(writeStartRow, col, colValues.length, 1)
        .setValues(colValues);
    }
  });
}

■使用例

/**
 * CSVファイルの指定列を、スプレッドシートにとびとびで追記出力する
 * 便利ラッパー関数(内部で ①+② を呼ぶだけ)
 */
function importCsvColumns(fileId, startRow, columns, sheet) {
  const records = readCsvAsObjects(fileId);  // ①
  writeRecordsSparseAppend(startRow, records, columns, sheet); // ②
}

呼び出し例

function sampleImportCsv() {
  const fileId = 'ここにCSVのファイルID';

  // CSVのヘッダー名と、シート列の対応を定義
  const columns = [
    { header: '取引先コード', key: 'customer_code', col: 3 }, // C列
    { header: '取引先名',     key: 'customer_name', col: 5 }, // E列
    { header: '金額',         key: 'amount',        col: 8 }, // H列
  ];

  importCsvColumns(fileId, 1, columns);  // 1行目をヘッダー行にする
}