2025年 2月 の投稿一覧

【GAS】appendRow()の同時実行は競合するのか

はじめに

GASでシート末尾に値を追加するappendRow()について、
同時に実行したら同じ行を編集してしまうのか、検証しました。
結論:同時実行は競合します。
以下、検証方法の紹介です。

コードと出力結果

function myFunction() {
  const sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート1");

  let now = dayjs.dayjs();
  while(now.format("HH:mm")!="09:30"){
    now = dayjs.dayjs();
  }

  sh.appendRow([dayjs.dayjs().format("YYYY/MM/DD HH:mm:ss")]);
  Utilities.sleep(300);
  sh.appendRow([dayjs.dayjs().format("YYYY/MM/DD HH:mm:ss")]);
  Utilities.sleep(300);
  sh.appendRow([dayjs.dayjs().format("YYYY/MM/DD HH:mm:ss")]);
  Utilities.sleep(300);
  sh.appendRow([dayjs.dayjs().format("YYYY/MM/DD HH:mm:ss")]);
  Utilities.sleep(300);
  sh.appendRow([dayjs.dayjs().format("YYYY/MM/DD HH:mm:ss")]);
}

4つのタブで同じスクリプトエディタを開き、実行します。
すると9:30になった瞬間同時に書き込みが走り、合計20行に値が入るはずです。
しかし、何度かやっても17~19行しか値が入りませんでした。
やはり20回の実行のうち、最終行を取得するタイミングが重なってしまうようでした。
気になる方はシートからエディタを開いてコピペして試してみてください。
(シートなので証拠になりませんが、イメージ図です。)
18行しか書き込まれていないイメージ図

対処方法はあるのか

appendRow()を使う限り、競合の可能性は捨てきれないでしょう。
appendRow()以外の方法で、絶対に競合を避けたい場合には、
GoogleDriveにファイルを保存する等の手段があります。

シート行に保存しようとしていたデータ1つ1つについて、
Drive上にJSONなどのファイルを設ければ、競合可能性を相当下げることができます。
ファイル名を日次+UUIDなどにしておけば、同名ファイルが生成されることもありません。
注意点として、それらのJSONを同時に変更可能な仕様にしてはいけません。

さいごに

GoogleAppsScriptを使う以上、
一部の処理ではどうしても競合が発生してしまいます。
上述のような打開策もありますが、仕様が分かりにくくなります。
外部のデータベースの利用なども視野に入れて仕様検討するのが無難かと思います。

GASで銀行くんAPIを実行して銀行コードと支店コードを全件取得

はじめに

GASで銀行くんAPIを使って、
金融機関コードと支店情報をスプレッドシートに一括取得してみました。
銀行コード等を取得したい方はぜひ参考にしてみてください!

コードと出力結果


function ginko() {  
  const baseUrl = `https://bank.teraren.com/banks.json?per=2000`;

  const response = UrlFetchApp.fetch(baseUrl);
  const json = JSON.parse(response.getContentText());

  const pasteArr = json.map(x => [x.code, x.normalize.name]);
  const sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("銀行くん");
  sh.getRange("A2:B").clear();
  sh.getRange(2, 1, pasteArr.length, pasteArr[0].length).setValues(pasteArr);
}


function shiten(){
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const bankSh = ss.getSheetByName("銀行くん");
  const bankJson = bankSh.getRange("A2:B").getValues().filter(x => x[0])
                    .map(x => ({code:x[0], name:x[1]}));

  bankJson.forEach(x => {
    const url = `https://bank.teraren.com/banks/${x.code}/branches.json?per=1000`;
    const response = UrlFetchApp.fetch(url);
    const responseJson = JSON.parse(response.getContentText());
    x.brunchJson = responseJson;
  });

  const maxColumns = Math.max(...bankJson.map(x => x.brunchJson.length + 2));
  const pasteArr = bankJson.map(x => {
    const rowData = [x.code, x.name];
    x.brunchJson.forEach(y => rowData.push(`${y.code}_${y.name}`));
    while (rowData.length < maxColumns) {
      rowData.push("");
    }
    return rowData;
  });

  const brunchSh = ss.getSheetByName("銀行くん支店");
  brunchSh.getRange("2:1500").clear();
  brunchSh.getRange(2, 1, pasteArr.length, maxColumns).setValues(pasteArr);
}

関数名やシート名が適当すぎるので、必要に応じて変更してください。1
スプレッドシートにコンテナバインドした前提で、こんな感じです。
銀行くんAPIの結果として金融機関コードや支店コードのリストがスプレッドシートに出力されている画像

さいごに

以前紹介した記事では、
無料版では上限問題で全支店情報まで日次取得できませんでした。
今回の銀行くんの場合、支店コードを毎日取得しても制限に引っ掛かりません!
毎日実行のトリガー設定を行うなど、便利に活用してみてください。

BankcodeJP APIで銀行コードと銀行名を一括取得【GAS】

はじめに

GASでBankCodeJP APIを使って、
金融機関コードをスプレッドシートに一括取得してみました。
銀行コード等を取得したい方はぜひ参考にしてみてください!

コードと出力結果

function getAllBanks(){
  
  const apikey = "あなたのAPIキー";
  const baseUrl = `https://apis.bankcode-jp.com/v3/banks?apikey=${apikey}&limit=2000`;
  let nextCursor = "";
  const banks = [];

  do{
    const response = UrlFetchApp.fetch(baseUrl+(nextCursor ? `&nextCursor=${nextCursor}` : ""));
    const json = JSON.parse(response.getContentText());
    banks.push(...json.banks);
    if(json.hasNext) nextCursor = json.nextCursor;
    else nextCursor = "";
  }while(nextCursor);

  const pasteArr = banks.map(x => [x.code, x.name, x.halfWidthKana, x.fullWidthKana, x.hiragana, x.businessTypeCode, x.businessType]);
  const sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("bank");
  sh.getRange("A2:G").clear();
  sh.getRange(2, 1, pasteArr.length, pasteArr[0].length).setValues(pasteArr);

}

スプレッドシートにコンテナバインドした前提で、こんな感じです。
銀行コードなど銀行情報がシート出力されているイメージ

さいごに

尚、このAPIは無料版だと制限があります。
支店コードも概ね同様の書き方で全て取得できますが、
日次で全金融機関の支店コードを取得しようとすると、上限に引っ掛かります。
別の記事で、他のAPIの使用例も紹介しようと思いますので、
ぜひそちらの記事も参考にしてみてください!

⇒(追記)銀行くんAPIに関する記事を公開しました。