Skip to content

Instantly share code, notes, and snippets.

@naosim
Created December 9, 2025 15:46
Show Gist options
  • Select an option

  • Save naosim/d0bbb6494f0e3a293799c8792916b374 to your computer and use it in GitHub Desktop.

Select an option

Save naosim/d0bbb6494f0e3a293799c8792916b374 to your computer and use it in GitHub Desktop.
【gas】spreadsheetを更新する
function myFunction() {
const fileId = '読み込むtsvファイルのID';
const spreadSheetId = 'スプシ';
const sheetName = 'シート1';
const filterRowNumber = 2; // 1オリジン
const tsvData = [fileId].map(readFile).map(parseTsv)[0];
writeToSheet(tsvData, spreadSheetId, sheetName, filterRowNumber);
}
function writeToSheet(data, spreadSheetId, sheetName, filterRowNumber = 1) {
const ss = SpreadsheetApp.openById(spreadSheetId);
const sheet = ss.getSheetByName(sheetName);
if (!sheet) {
Logger.log(`エラー: 指定されたシート名 (${sheetName}) が見つかりませんでした。`);
return;
}
sheet.clearContents();
const rowCount = data.length;
// カラム数:最初の10行の中で最も長いもの
const colCount = data.slice(0, 10).reduce((memo, row) => Math.max(memo, row.length), 0);
// 足りないカラムを追加する
data = data.map(row => {
if(row.length == colCount) {
return row;
}
return [...row, ...new Array(colCount - row.length).fill('')]
})
data = data.map(row => row.map(v => convertBr(v)));
// データの範囲 (A1セルから始まり、データ行数 x データ列数) を取得
const targetRange = sheet.getRange(1, 1, rowCount, colCount);
// 範囲に二次元配列のデータを書き込み
targetRange.setValues(data);
const tableRange = sheet.getRange(filterRowNumber, 1, rowCount + 1 - filterRowNumber, colCount);
// フィルターを消す
removeFilter(sheet);
// フィルターを作る
tableRange.createFilter();
// 枠線を全部消す
targetRange.setBorder(false, false, false, false, false, false);
// 枠線を描く
tableRange.setBorder(
true, true, true, true,
true, true,
'#000000',
SpreadsheetApp.BorderStyle.SOLID
);
}
function removeFilter(sheet) {
const filter = sheet.getFilter();
if(filter) {
filter.remove();
}
}
/** 改行があったら変換する */
function convertBr(text) {
if(text.indexOf('<br>') == -1) {
return text;
}
return '=' + text.split('<br>').map(v => `"${v}"`).join("&char(10)&");
}
/**
* Google Drive上のTSVファイルを読み込み、二次元配列としてログに出力する関数
*/
function readTsvFile(fileId) {
try {
const fileContent = readFile(fileId);
// 3. 取得した文字列をデータグリッド(二次元配列)に変換
const data = parseTsv(fileContent);
// 4. 結果のログ出力
Logger.log('--- TSVファイルの内容 (二次元配列) ---');
// データの最初の数行をログに出力して確認
data.slice(0, 10).forEach((row, index) => {
// 各行の配列をカンマ区切りで表示
Logger.log(`[行 ${index + 1}]: ${row.join(', ')}`);
});
Logger.log('--- 全体の行数 ---');
Logger.log(`読み込まれた行数: ${data.length}`);
// 必要に応じて、この 'data' 変数をGoogleスプレッドシートへの書き込みなどに使用できます。
return data;
} catch (e) {
Logger.log(`エラーが発生しました: ${e.toString()}`);
// ファイルIDが間違っている場合などにエラーが出ます
}
}
function readFile(fileId) {
// 1. ファイルオブジェクトを取得
const file = DriveApp.getFileById(fileId);
// 2. ファイルの内容を文字列として取得(TSVファイルは通常UTF-8エンコーディングを想定)
const fileContent = file.getBlob().getDataAsString('UTF-8');
return fileContent;
}
/**
* TSV形式の文字列を解析して、二次元配列に変換するユーティリティ関数
* @param {string} tsvString TSV形式のデータを含む文字列
* @returns {string[][]} 解析されたデータを含む二次元配列
*/
function parseTsv(tsvString) {
// 文字列を行に分割 (行末はCRLF(\r\n)またはLF(\n)のどちらも考慮)
const rows = tsvString.split(/\r?\n/);
// 空行を取り除き、各行をタブで分割
const data = rows
.filter(row => row.trim() !== '') // 空行をフィルタリング
.map(row => row.split('\t')); // タブ(\t)でセルに分割
return data;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment