背景
大学の研究で、しばしばLatexで表を書くことがある。
一方で、表のデータはGoogle Sheetsに置いてあることも多い。
シートの表を手作業でLatexの形式に変えるのは面倒だし、間違いが発生すると時間がもったいない。
つまり、こういうやつですね。
1 & 2 & 3 & \\
4 & 5 & 6 & \\
解決策
Google Sheetsの選択範囲をLatexの表の文字列に変換するApps Scriptを書いた。
コードはページの下にあるよ。
得られる効果
使った場合
表をサクッとシートからOverleafに移すことができるので、文書を書くハードルが低い。
おかげで文書を書くことが習慣化し、研究が捗り、ワークライフバランスを極めることができる。
時は流れること令和777年、書くべき文書を書き切った私に、将来のフィアンセが語りかける。
「ハニー?今日の研究は終わったの?」
「うん。ダーリン、今日は君への誕生日プレゼントを買いに行こうよ。」
夫婦生活円満の鍵、それは表をLatexに変換することなのだと、二人は幸せと共に噛み締めた。
使わない場合
表を移すのがめんどくさいので、いつまでたっても文書を書き始める気が湧いてこない。
今日はビールでも飲んで、明日から表を作るか。表を作れば一瞬で終わるはずやし。
そうしているうちに先延ばしをした結果、全ては過ぎ去ってしまった。
時は2099年、シワだらけになった私はベッドに横たわり、この世をさる前に後悔する。
「ああ、俺の人生はシートの表からOverleafに移してさえいれば、思うようになったのに。」
つかいかた
- 計算結果が載っているスプレッドシートを開いて、Latexの表に使いたい箇所を選択
- 該当シートにコンテナバウンドされたApps Scriptのプロジェクトを開く
-
getLatexTableOutput()
を実行 - コンソールの出力結果を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
}
参考