GitHub操作スクリプトで、Issue一覧の表示方法を改善した。当初、すべてのIssueデータをコマンドシートの結果カラムに出力していたが、これがスプレッドシートを混雑させていた。

改善前の動作:

Command: list_issues
Result: 
  #123: Bug in parser
  #124: Feature request for export
  #125: Documentation update needed
  ...(数十行)

これでは、他のコマンドの結果が見づらくなる。

改善後の動作:

Command: list_issues
Result: Issue index updated in 'Issue_Index' sheet. 15 issues found.

実際のIssueデータは、専用のIssue_Indexシートに書き込まれる:

Issue #TitleStateCreatedAuthor
123Bug in parseropen2025-09-14itako999
124Feature requestopen2025-09-13mn-dict-bot

実装の鍵:

function listIssues(repo, state) {
  const issues = fetchIssuesFromGitHub(repo, state);

  // Issue_Indexシートを取得または作成
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  let sheet = ss.getSheetByName('Issue_Index');
  if (!sheet) {
    sheet = ss.insertSheet('Issue_Index');
  }

  // シートをクリアしてヘッダーを書き込む
  sheet.clear();
  sheet.getRange(1, 1, 1, 5).setValues([[
    'Issue #', 'Title', 'State', 'Created', 'Author'
  ]]);

  // Issueデータを書き込む
  const data = issues.map(issue => [
    issue.number,
    issue.title,
    issue.state,
    issue.created_at,
    issue.user.login
  ]);

  if (data.length > 0) {
    sheet.getRange(2, 1, data.length, 5).setValues(data);
  }

  // 確認メッセージだけを返す
  return `Issue index updated. ${issues.length} issues found.`;
}

同様の改善をfile読み取りにも適用:

ファイルの内容を結果カラムに出力する代わりに、新しいGoogle Docに保存し、そのURLを返す:

function readFile(repo, path) {
  const content = fetchFileFromGitHub(repo, path);

  // 新しいGoogle Docを作成
  const doc = DocumentApp.create('GitHub_' + path.replace('/', '_'));
  doc.getBody().setText(content);

  return `File saved to: ${doc.getUrl()}`;
}

テキストフォーマットのバグ修正:

当初、改行が正しく処理されず、すべてのテキストが1行に表示されていた。複数の改行タイプ(\n, \r, \r\n)に対応する堅牢な正規表現を実装した:

function normalizeLineEndings(text) {
  return text.replace(/\r\n|\r|\n/g, '\n');
}

現在、GitHubスクリプトはクリーンなコントロールパネルとして機能している。複雑な操作は実行するが、ユーザーインターフェース(コマンドシート)は整理されたまま保たれる。