1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Google Sheetsの表をLatexの表の文字列にGASで変換して青春を謳歌する

Last updated at Posted at 2022-01-29

背景

大学の研究で、しばしばLatexで表を書くことがある。
一方で、表のデータはGoogle Sheetsに置いてあることも多い。
シートの表を手作業でLatexの形式に変えるのは面倒だし、間違いが発生すると時間がもったいない。

つまり、こういうやつですね。

latex
1 & 2 & 3 & \\
4 & 5 & 6 & \\

解決策

Google Sheetsの選択範囲をLatexの表の文字列に変換するApps Scriptを書いた。
コードはページの下にあるよ。

得られる効果

使った場合

表をサクッとシートからOverleafに移すことができるので、文書を書くハードルが低い。
おかげで文書を書くことが習慣化し、研究が捗り、ワークライフバランスを極めることができる。

時は流れること令和777年、書くべき文書を書き切った私に、将来のフィアンセが語りかける。

「ハニー?今日の研究は終わったの?」
「うん。ダーリン、今日は君への誕生日プレゼントを買いに行こうよ。」

夫婦生活円満の鍵、それは表をLatexに変換することなのだと、二人は幸せと共に噛み締めた。

使わない場合

表を移すのがめんどくさいので、いつまでたっても文書を書き始める気が湧いてこない。
今日はビールでも飲んで、明日から表を作るか。表を作れば一瞬で終わるはずやし。
そうしているうちに先延ばしをした結果、全ては過ぎ去ってしまった。

時は2099年、シワだらけになった私はベッドに横たわり、この世をさる前に後悔する。
「ああ、俺の人生はシートの表からOverleafに移してさえいれば、思うようになったのに。」

つかいかた

  1. 計算結果が載っているスプレッドシートを開いて、Latexの表に使いたい箇所を選択
  2. 該当シートにコンテナバウンドされたApps Scriptのプロジェクトを開く
  3. getLatexTableOutput()を実行
  4. コンソールの出力結果をOverleafにぶちこむ

諸注意

表示する小数点の指定

なお、数値の場合は、小数点の指定はDECIMAL_POINTSにより行ってください。

表の枠線の調節とバックスラッシュのエスケープ

また、表の枠線とか調節したい時は、適切にseparatorを変更してください。その際は、JavaScriptのバックスラッシュのエスケープに注意してください。

具体的には?

\hlineを含めたい場合は、めんどくさいですが\\hline と2回バックスラッシュつけんといかんとですたい。

これは、GAS経由で数値を取るときに、シートでの表示桁, i.e. 1.2, ではなく、ガチの値, i.e. 1.23456, をとってしまう仕様に対応するためです。

まとめコード


// Google Sheet does not take care of zero paddings of decimal points.
// Thus you need to convert number to string with zero-padding by the apps script side.
const DECIMAL_POINTS = 2

function getLatexTableOutput(){
  var activeSheet = SpreadsheetApp.getActiveSheet();
  // https://developers.google.com/apps-script/reference/spreadsheet/selection
  var selection = activeSheet.getSelection();
  const selectedValues = selection.getActiveRange().getValues()
  const latexTableOutput = convert2Dto1DArr(selectedValues)
  console.log(latexTableOutput)
}

function convert2Dto1DArr(input){
  const formattedInput = input.map(rowElmArr=>rowElmArr.map(elm=>convertNumberToStr(elm)))
  // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/join
  const joinedWithAmpersand = formattedInput.map(rowElmArr=>rowElmArr.join(' & '))
  // Uisng backslash twice to escape
  const separator = ' \\\\ \n'
  return joinedWithAmpersand.join(separator) + separator
}

// Converts number to String with two decimal points
function convertNumberToStr(input){
  return (typeof input === 'number')? input.toFixed(DECIMAL_POINTS): input
}


参考

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?