GASでSpreadsheetにデータを挿入していくときのTip

ちょっとした調べ物をするために、Google Apps Script(以下GAS)を使ってデータを作り、スプレッドシートに記録していきました。日付ごとにシートを作って、それぞれのシートに一定量のデータを記録していくスクリプトです。

問題なく動いていたのですが、あるところから急に実行速度が遅くなり、実行時間が上限にあたり途中で止まってしまうようになりました。何が原因だろうと調べたところ、下記のような感じで取得したデータを1行ずつ追加しているところに問題がありました。

sheet.getRange(row_number, 1, 1, column_count ).setValues([[ ... ]]);

Sheetを新規で作成すると、行数の初期値が1000行となっており、上記の例でrow_numberが1000を超えると、1行ずつ「行を追加して記録」という形になってしまいます。この1行ずつ行を追加していくというのが処理を遅くする原因になっていました。

ということで、処理の最初の方で、下記のようにがっつりとSheet全体の行数を確保することで問題を回避できました。

sheet.insertRows(1,max_row_count);

GitHub ActionsでPull Requestを自動的にmergeする

こんにちは、id:chris4403 です。Ossan.fmというPodcastid:nagayama さんとふたりでやってまして、毎週金曜日の12時ごろに公開しています。
Ossan.fmは、Yatteiki.fmさんが公開している以下のコードを利用して、GitHub Pages上で運用しています。

github.com

Podcast公開までの作業フローは、

  1. 収録
  2. 収録した音声データを編集 by nagayama
  3. 公開用のテキストページを作成 by chris4403
  4. 次公開用のbranchを作成
  5. 公開用のbranchに編集済みの音声データ・テキストページをpush / Pull Request作成
  6. YouTubeに動画ファイルをアップロード&テキストを追加して、金曜日の12時ごろ公開されるように登録 by nagayama
  7. 毎週金曜日の12時頃にPull Requestを master ブランチにmerge by chris4403 or nagayama

ざっくりこんな感じでやっていました。

で、この一番最後の公開作業を、うまいこと自動化できないかなーと id:nagayama と話していて、GitHub Actionsでできるのでは?と、調べてみたらできたという話です。


まずは、GitHub上で、新しいActionsを設定します。

f:id:chris4403:20200204165426p:plain
「Actions」タブ内の「New workflow」をクリック

いくつかサンプルから作成が出てきますが、いちから自分でセットアップするのを選択。

f:id:chris4403:20200204165441p:plain
画面右の「Set up a workflow yourself」をクリック

Repository直下に ".github/workflow/"ディレクトリができて、そこにworkflowを設定するYAMLを書く画面が出てきます。YAML名を設定しつつ、下のエディタに下記のように設定しました。

name: ScheduledTask

on:
  schedule:
    - cron: '0 3 * * 5'

jobs:
  automerge:
    runs-on: ubuntu-latest
    steps:
      - name: Merge pull requests
        uses: pascalgn/automerge-action@v0.7.3
        env:
          GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"

cronと書いてある行が、本workflowを実行するタイミングです。crontabに記載する書式で書きましょう。

自動的にmergeする処理は、以下のGitHub Actions Marcketplaceで公開されいてる"automerge-action"を利用しました。

https://github.com/marketplace/actions/merge-pull-requestsgithub.com

これで、Pull Requestに "automerge" ラベルがついているものが、毎週金曜日の日本時間12時に master ブランチへ mergeされます。

Configurationを見ると、このラベルを変更したり、mergeするメソッドを指定したりと色々できそう。

ページを更新する分にはデフォルトの使い方で良いので、しばらく使ってみることにします。


ということで、もろもろ整備されたPodcast公開までの最新の作業フローは以下の感じに。

  1. 収録
  2. 収録した音声データを編集し、次公開用のbranchを作成してpush / Pull Requestを作成 by nagayama
  3. 公開用のテキストページを作成 / タイトル決定 by chris4403
  4. ブランチにautomergeラベルを付与 by chris4403
  5. Twitterで公開Tweetを予約(公開日の13:00) by chris4403
  6. タイトルを画像にしてYouTube用の動画ファイル作成&アップロード、金曜日の12時に公開されるように登録 by nagayama

これらのTODOは、Pull RequestのテンプレートにTODOとしてフィルインされるようになっていて、それぞれ自分の担当箇所が終わったらチェックをつけるようにしています。

mackerelにP-Rを送った話

はてなで社長をしている id:chris4403 です。
この記事は、Mackerel Advent Calendar 2018の3日目の記事です。


11月の頭に、mackerelにプルリクエストを送って無事にマージされたので、その裏側をここに記します。


mackerelのHTTPのHeaderには採用サイトへのリンクが仕込まれていて、以下のコマンドを実行すると、見ることができます。

curl -sIL mackerel.io | grep recruit

なにげにコマンドを実行したところ、リンクが古かったことに気が付きました(リンク先にアクセスすると、新しい採用サイトに遷移するので実害はなかったですが)。で、チームのissueに登録しようかなと、ディレクターのid:daiksy さんに聞いたところ、P-Rお待ちしてますとのことだったので、さくっと修正してP-Rを作成しました。


f:id:chris4403:20181203183146p:plain:w613
f:id:chris4403:20181203183202p:plain:w602



まあ、リンクの書き換えだけなのでほんと大したことない内容ですが。
ブランチを作ってpushしたところ、チームのチャンネルではテックリードid:astjより温かい言葉をいただきました。

f:id:chris4403:20181203183857p:plain:w584


全員でレビューする、は冗談ですが、このあとサクッとレビューしてもらい、無事にマージされたという話です。

というわけで、今以下のコマンドを実行すると、私が丹精込めて修正したリンクが出てきますので、ぜひリンク先にも訪問いただき、興味が湧いたらご応募いただければと思います。

curl -sIL mackerel.io | grep recruit

P(ull)R(equest)の話ですが、最後は採用のPRでした、というオチで。ちゃんちゃん。