はじめに
KG-7thの後藤です。
自動で仮想通貨を売買するアプリを作ったのですが、
為替の推移と購入・売却時の価格を記録しておかないとフィードバックができず。。
アプリ内で自動でエクセルに記載させて楽しようと思います。
ちなみに現在までの成果は1000円ほど損してます。笑ってください。
関連記事
CoinCheckのWebAPIの使い方については以下でご紹介しています。
基本仕様
- 開発言語:Node.js + TypeScript
- ライブラリ:exceljs
目的
以下のようなエクセルを用意しました。
(お金ないのでLibreOfficeで作成しましたが、拡張子は.xlsxにしてます)
選択範囲であるB3・C3以下に自動で値を入れていくのが目的です。
コード解説
ワークブック・ワークシートの指定
Excelファイルのパスとワークシートの名前を使います
private EXCEL_FILE_PATH = './result.xlsx';
// ワークブックを読み込み
protected workbook = new ExcelJS.Workbook();
// ワークシートを取得
protected worksheet: Worksheet | undefined;
/**
* ワークブックの取得に同期処理が必要なため、asyncを使用して初期化
* @param worksheetName ワークシート名
* @returns {Promise<void>} ワークブックの初期化
* @throws {Error} ワークブックの初期化に失敗した場合
*/
async initialize(worksheetName: "PRICE" | "BO-SELL" | "BO-BUY" | "MA-SELL" | "MA-BUY" | "RSI-SELL" | "RSI-BUY"): Promise<void> {
try {
// ワークブックを読み込み
await this.workbook.xlsx.readFile(this.EXCEL_FILE_PATH);
// ワークシートを取得
this.worksheet = this.workbook.getWorksheet(worksheetName);
} catch (error) {
// エラー処理
console.error('Error initializing Excel worksheet:', error);
}
}
最後の行を取得する
B3、B4、B5・・のようにどんどん値が入っていくので、
最新の一番下の行を取得する関数を作成しました。
B1は空白セルなので、startRowNumberを引数に入れることで
空白セルを飛ばして行のチェックをするようにしています。
/**
* 対象列の最終行を取得する
* @param columnNumber
* @param startRowNumber
*/
getLastRowNumber(columnNumber: number, startRowNumber: number): number {
if (!this.worksheet) {
throw new Error('Worksheet is not initialized');
}
// 最終行を取得
let lastRowNumber = 0;
this.worksheet.eachRow((row, rowNumber) => {
if (rowNumber < startRowNumber) {
// 指定行より上の行はスキップ
return;
}
// 指定列の値が空でない場合、最終行とする
const cell = row.getCell(columnNumber);
if (cell.value !== null && cell.value !== undefined && cell.value !== '') {
lastRowNumber = rowNumber;
}
});
return lastRowNumber;
}
テキストの入力
getCell(セルを指定).valueだけで値が設定できるらしいです。
/**
* テキストの入力
* @param columnAlphabet
* @param rowNumber
* @param cellValue
*/
async appendCellValue(columnAlphabet: string, rowNumber: number, cellValue: number | string): Promise<void> {
if (!this.worksheet) {
throw new Error('Worksheet is not initialized');
}
// セルに値を追加
this.worksheet.getCell(`${columnAlphabet}${rowNumber}`).value = cellValue;
// ファイルを保存
await this.workbook.xlsx.writeFile(this.EXCEL_FILE_PATH);
}
終わりに
以下のリポジトリで使用しています。
もしかしたらmainブランチにはマージされてないかもです。
ExcelWorksheetAdapter.ts