Skip to content

Instantly share code, notes, and snippets.

@kaz-utashiro
Last active August 25, 2023 01:20
Show Gist options
  • Save kaz-utashiro/cc65f6a9075127912a08ee37247d157b to your computer and use it in GitHub Desktop.
Save kaz-utashiro/cc65f6a9075127912a08ee37247d157b to your computer and use it in GitHub Desktop.
Google Spread Sheet から Document を自動生成するスクリプト
function onOpen() {
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var menuEntries = [ {name: "印刷用ドキュメント作成", functionName: "createDoc"} ];
spreadsheet.addMenu("カスタムメニュー", menuEntries);
}
const removeFirstEmptyParagraph = (body) => {
const firstParagraph = body.getParagraphs()[0];
if (firstParagraph.getText() === '') {
firstParagraph.removeFromParent();
}
}
const clearDocContent = (doc) => {
['getBody', 'getFooter', 'getHeader'].forEach((method) => {
let section = doc[method]();
section && section.clear();
});
}
const getOrCreateDocument = (title) => {
const files = DriveApp.getFilesByName(title);
if (files.hasNext()) {
const file = files.next();
const doc = DocumentApp.openById(file.getId());
clearDocContent(doc);
return doc;
} else {
return DocumentApp.create(title);
}
}
const createDoc = () => {
// スプレッドシートとシートを取得
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
// スプレッドシートの名前にシート名を追加する
const sheet = spreadsheet.getActiveSheet();
const title = `${spreadsheet.getName()}-${sheet.getName()}`;
// データを取得
const data = sheet.getDataRange().getValues();
// Googleドキュメントがあれば開く、なければ作る
const doc = getOrCreateDocument(title);
if (!doc) {
throw new Error("Failed to open or create.");
}
const body = doc.getBody();
// フッターを取得または作成
const footer = doc.getFooter() ? doc.getFooter() : doc.addFooter();
// フッターにテキストを追加し、センタリング
footer.appendParagraph("Attack! 299")
.setAlignment(DocumentApp.HorizontalAlignment.CENTER)
.setFontSize(20);
// 2行目以降のデータについて処理
data.slice(1).forEach((row, index) => {
// 2番目以降では改ページを挿入
if (index > 0) {
// 2ページ目以降は改ページを挿入すべきだが、レイアウトがうまくいかないので挿入しない方がいい
// body.appendPageBreak();
}
const [number, team, name] = row;
Logger.log(`ゼッケン:${number}, チーム:${team}, 氏名:${name}`);
body.appendParagraph(number.toString()).setFontSize(160);
body.appendParagraph(team).setFontSize(40);
body.appendParagraph(name).setFontSize(80);
if (index === 0) {
removeFirstEmptyParagraph(body);
}
});
}
@kaz-utashiro
Copy link
Author

イベントの参加者リストから荷物の預かり札を印刷するためのスクリプト。
本当は PDF を生成したかったが、うまくいかなかったので、Google Document を作るところでやめた。
横に印刷する想定だが、印刷方向を指定することができないので、Document を開いてからページの向きを横に変更しなければならない。
テンプレートを用意して、それを修正するようにすればうまくいくはず。
そうすれば、例えば背景に画像を挿入するなどもできる。

メモ

  • 0行目はラベルなので1行目から処理している
  • カラムは「ゼッケン」「チーム名」「氏名」で固定
  • 2番目以降は最初に会ページを挿入している
  • 最初の項目を処理した後で、先頭の空のパラグラフを削除している。最初に削除しようとすると失敗する。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment