Created
December 9, 2025 15:46
-
-
Save naosim/d0bbb6494f0e3a293799c8792916b374 to your computer and use it in GitHub Desktop.
【gas】spreadsheetを更新する
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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