キッカーメモ

ポケサー関連のGoogle Apps Scriptなどを活用したツールを、備忘録を兼ねて紹介するブログです。使ったらTwitterとか口頭とかで記事を宣伝してくれると嬉しいです。もしミスがあればコメントください。

Excelのリストから名前等を自動入力しWordで名札を作る

ポケサーで新歓期や文化祭、大会を開催する時は名札を用意することが多いと思います。

初対面の人に接する時には名前を一々聞くより名札で確認した方が効率的です。

もちろん名札の名前欄を空けてペンでそれぞれ書いてもらっても良いですが、手書きの字は読みにくい場合もあり、またどうせデザインして印刷するなら名前なども印刷した方が良いです。

しかし、名前やTwitter ID、所属サークルなどを全て手入力するのはとても面倒です。そのため、Excelの名前リストから自動入力して名札を作成する方法を紹介します。

名前のリストから自動で名前欄を埋めるために、その機能があるMicrosoftのWordを使います。さらに言えば、「差し込み印刷」機能の「名簿」を使います。「ラベル」などもあってそちらの方が良さそうに見えますが、テキストボックスが使えないので駄目です。また、残念ながらGoogleドキュメントには「差し込み印刷」機能がありません。

リストはExcelファイルを使います。大会の参加申請をGoogleフォームで行う場合はスプレッドシートで一覧が出ると思うので、それをExcelファイル(.xlsx)形式でダウンロードするのが良いでしょう。

 

 

やり方

 

以下、1枚のA4用紙に横2枚、縦4枚の名札を作成する前提で説明します。

まず、レイアウトタブでいくつか設定します

余白を作りたい名札のサイズに応じて変更してください。自分は「狭い」にしました。

「ページ設定」グループの「段組」→「段組の詳細設定」で、 「2段」(横の枚数分)を選び、「間隔」を編集して「0mm」にします。

「ページ設定」グループの右下の「ページ設定」をクリックして「ページ設定」ダイアログボックスを開き、1ページあたりの行数を設定します。これは縦の枚数の倍数にしてください。余白や文字サイズによって変わりますが、最初は40行前後なので縦4枚なら40行にします。

 

次に、実際に名札をデザインしていきます。

名札1枚分の行数+1個の改行マークを表示し、最後の改行マークが見える状態でそれより上に画像やテキストボックスを配置してください。本文への入力は文字サイズを変えない方が良いため避け、テキストボックスのみを使用してください。

例えば縦40行に4枚印刷する場合は、改行マークを11個表示させ、最後の1つは見える状態で、上10行分のスペースを使う,ということです。

画像やテキストボックスは左クリックして「文字列の折り返し」を「前面」や「背面」に変え、改行の位置が変わらないようにします。

一括で変えたいときは、最初に

「ファイル」タブ画面の左メニューから「オプション」を選択

「Word のオプション」画面の左メニューから「詳細設定」を選択

「切り取り、コピー、貼り付け」グループの真ん中あたりにある「図を挿入/貼り付ける形式」で「行内」を「前面」に切り替え

を行ってください。

名札デザインの配置が終わったら、最後の操作に入ります。

差し込み文書→差し込み印刷の開始→差し込み印刷ウィザード

で右に操作パネルみたいなのが出ます

名簿→現在の文書を利用→既存のリストを使用、参照で使うエクセルファイルを選択してください。「先頭行をタイトル行として使用する」はエクセルファイルによるのでチェックを入れるか考えてください。

差し込みフィールドの挿入で名前などの項目を入れていってください。

名簿のプレビュー表示に進むと実際にテキストボックスに名前などが入ります。文字のフォントやサイズを調整してください。

差し込み印刷の完了で新しい文書へ差し込みを選択、リストの差し込む範囲を選択すると、Wordの新しいウインドウで名前などが入った状態の文書が出力されます。これを保存して印刷してください。

隙間があると切るときに手間なので、もしデザインに悪影響が無ければ元のファイルを直した方がいいです。

また、名前が長い場合は出力後のファイルで個別に文字サイズを変更しましょう。

 

最後まで読んでいただきありがとうございました。Wordは文書作成ソフトなのでデザインには不十分ですが、素材をillustratorとかで作ればある程度マシになるはずです。

メンバーが変わっても簡単に名札を作れるのは便利だと思うので、是非試してみてください。もし使ったときは、この記事やブログを紹介してもらえると嬉しいです。

 

参考文献

https://www.724685.com/weekly/i/qa150121.htm

Googleカレンダーの1週間の予定を通知するDiscord BOT

Google Apps Scriptで下のコードを貼り,2か所書き換え,トリガーを設定すれば通知してくれます.

書き換える部分について

まずDiscordで,予定を送信したいテキストチャットを選択して設定に入ります。
連携サービスから新しいウェブフックを選び、ウェブフックURLをコピーしてメモしてください。

また,グーグルカレンダーから取得したいカレンダーを選択し、カレンダーの統合タブからカレンダーIDをメモしてください。

これらをコードの1行目と2行目に貼り付けます.

 

コピペが終わったら,トリガーを以下のように作成してください.
  実行する関数: notifyDaily
    デプロイ時に実行: Head
  イベントのソース: 時間主導型
  時間ベースのトリガーのタイプを選択: 週ベースのタイマー

曜日,時刻は適当に決めてください.

 

終日かつ1日だけの予定は通知に時間が表示されないようにしたので,”ポケモン新作発売”や”部誌の記事提出期限”みたいなのはその形式で入れるのがお薦めです.

場所も表示され、住所を省略するために"〒"や”, “(カンマ&スペース)や”\n”(改行)がある場合はそれ以降が消えます

 

以下コード

 

const CALENDAR_ID = 'カレンダーID'; //カレンダーIDを入れてください
const WEBHOOK_URL = 'ウェブフックURL';//ウェブフックのURLをいれてね
var weekday = ["日", "月", "火", "水", "木", "金", "土"];

function notifyWeekly() {

var dt = new Date()
dt.setHours(0);
dt.setMinutes(0);
dt.setSeconds(0);
dt.setMilliseconds(0);

dt.setDate(dt.getDate() + 0 ); //数値を0から変えると別の週の予定が見られるよ

var dt2 = new Date(dt.getTime())


var k = 0;
var message = "来週の 予定ロトー!\n\n";

for ( var i = 0; i < 7; i++ ) {

dt.setDate(dt.getDate() + 1 );
var dayText = "";
var calendar = CalendarApp.getCalendarById(CALENDAR_ID);
var events = calendar.getEventsForDay(dt);

var calendarName = calendar.getId()
if ( calendarName == undefined ) {
message +="カレンダーが 読み込めないロト\n\n";
continue;
}

var events = calendar.getEventsForDay(dt);
if( events.length == 0 ) {
k++;
if (k >6){
  message +="予定は 今のところ ないロト\n\n"}
continue;
}

message += Utilities.formatDate(dt, 'JST', '★ MM/dd(' + weekday[dt.getDay()] + ')') + "\n";
dayText +="-----------------------" + "\n";

dt2.setTime(dt.getTime())
dt2.setDate(dt2.getDate() + 1 )

for ( var j = 0; j < events.length; j++ ) {
  if (events[j].getStartTime() > (dt.getTime()) 
  ||events[j].getStartTime() >= (dt.getTime())
  && events[j].getStartTime() <= (dt.getTime())
  && events[j].getEndTime() < (dt2.getTime() ))
  {
dayText += String(Utilities.formatDate(events[j].getStartTime(), "JST", "HH:mm"));
  }

  
  if (events[j].getStartTime() > (dt.getTime()  ) 
  ||events[j].getEndTime() < (dt2.getTime() ))
  {dayText += "-"}

if (events[j].getEndTime() < (dt2.getTime() ))
{
dayText += String(Utilities.formatDate(events[j].getEndTime(), "JST", "HH:mm"));
  }
if (events[j].getStartTime() > (dt.getTime()  ) 
&& events[j].getEndTime() <= (dt2.getTime() )
&& events[j].getEndTime() >= (dt2.getTime() )
  )
{
dayText += "24:00"
  }
  if (events[j].getStartTime() > (dt.getTime()  ) 
  ||events[j].getEndTime() < (dt2.getTime() ))
  {dayText += "\n"}
dayText += String(events[j].getTitle());

var site = String(events[j].getLocation());
if (site.length > 0){
if(site.indexOf("〒") > 0){
  site = site.substring(0, site.indexOf("〒"))
  }
if(site.indexOf(", ") > 0){
  site = site.substring(0, site.indexOf(", "))
  }
if(site.indexOf("\n") > 0){
  site = site.substring(0, site.indexOf("\n"))
  }
dayText += " -"
dayText += site;
}
dayText += "\n"
}

 dayText += "\n"
message += dayText;
}


const payload = {
username: "ロトムずかん",
content: message,
};

UrlFetchApp.fetch(WEBHOOK_URL, {
method: "post",
contentType: "application/json",
payload: JSON.stringify(payload),
});
}

 

参考文献

henn6.tokyo

Googleカレンダーの1日の予定を通知するDiscord BOT

Google Apps Scriptで下のコードを貼り,2か所書き換え,トリガーを設定すれば通知してくれます.

書き換える部分について

まずDiscordで,予定を送信したいテキストチャットを選択して設定に入ります。
連携サービスから新しいウェブフックを選び、ウェブフックURLをコピーしてメモしてください。

また,グーグルカレンダーから取得したいカレンダーを選択し、カレンダーの統合タブからカレンダーIDをメモしてください。

これらをコードの1行目と2行目に貼り付けます.

 

コピペが終わったら,トリガーを以下のように作成してください.
  実行する関数: notifyDaily
    デプロイ時に実行: Head
  イベントのソース: 時間主導型
  時間ベースのトリガーのタイプを選択: 日付ベースのタイマー

時刻は適当に決めてください.

 

終日かつ1日だけの予定は通知に時間が表示されないようにしたので,”ポケモン新作発売”や”部誌の記事提出期限”みたいなのはその形式で入れるのがお薦めです.

場所も表示され、住所を省略するために"〒"や”, “(カンマ&スペース)や”\n”(改行)がある場合はそれ以降が消えます

 

以下コード


const CALENDAR_ID = 'カレンダーID'; //GoogleカレンダーのIDを入れてね
const WEBHOOK_URL = 'ウェブフックURL';//ウェブフックのURLをいれてね
var weekday = ["日", "月", "火", "水", "木", "金", "土"];


function notifyDaily() {


var dt = new Date()
dt.setHours(0);
dt.setMinutes(0);
dt.setSeconds(0);
dt.setMilliseconds(0);


dt.setDate(dt.getDate() + 1 ); //数値を0から変えると今日以外の予定が見られるよ


var dt2 = new Date(dt.getTime())


var dayText = "";
var calendar = CalendarApp.getCalendarById(CALENDAR_ID);
var events = calendar.getEventsForDay(dt);


var calendarName = calendar.getId()
if ( calendarName == undefined ) {
var message ="カレンダーが 読み込めないロト\n\n";
}


var events = calendar.getEventsForDay(dt);
if( events.length > 0 ) {


var message = "明日の 予定ロトー!\n";
//message += Utilities.formatDate(dt, 'JST', '★ MM/dd(' + weekday[dt.getDay()] + ')') + "\n";
dayText +="-----------------------";
dayText += "\n"
dt2.setTime(dt.getTime())
dt2.setDate(dt2.getDate() + 1 )


for ( var j = 0; j < events.length; j++ ) {
if(events[j].getStartTime() < (dt.getTime())){
  dayText += String(Utilities.formatDate(events[j].getStartTime(), "JST", "MM/dd HH:mm"));
}


  if (events[j].getStartTime() > (dt.getTime()) 
  ||events[j].getStartTime() >= (dt.getTime())
  && events[j].getStartTime() <= (dt.getTime())
  && events[j].getEndTime() < (dt2.getTime() ))
  {
dayText += String(Utilities.formatDate(events[j].getStartTime(), "JST", "HH:mm"));
  }


  
  if (events[j].getStartTime() > (dt.getTime()  ) 
  ||events[j].getEndTime() < (dt2.getTime() )
  ||events[j].getStartTime() < (dt.getTime()) && events[j].getEndTime() > (dt2.getTime()))
  {dayText += "-"}


if (events[j].getEndTime() < (dt2.getTime() ))
{
dayText += String(Utilities.formatDate(events[j].getEndTime(), "JST", "HH:mm"));
  }
if (events[j].getStartTime() > (dt.getTime()  ) 
&& events[j].getEndTime() <= (dt2.getTime() )
&& events[j].getEndTime() >= (dt2.getTime() )
  )
{
dayText += "24:00"
  }
  if(events[j].getEndTime() > (dt2.getTime())){
  dayText += String(Utilities.formatDate(events[j].getEndTime(), "JST", "MM/dd HH:mm"));
}
  if (events[j].getStartTime() > (dt.getTime()  ) 
  ||events[j].getEndTime() < (dt2.getTime() )
  ||events[j].getStartTime() < (dt.getTime()) && events[j].getEndTime() > (dt2.getTime()))
  {dayText += "\n"}
dayText += String(events[j].getTitle());


var site = String(events[j].getLocation());
if (site.length > 0){
if(site.indexOf("〒") > 0){
  site = site.substring(0, site.indexOf("〒"))
  }
if(site.indexOf(", ") > 0){
  site = site.substring(0, site.indexOf(", "))
  }
if(site.indexOf("\n") > 0){
  site = site.substring(0, site.indexOf("\n"))
  }
dayText += " -"
dayText += site;
}
dayText += "\n"
}
dayText +="-----------------------";
 dayText += "\n"
message += dayText;

 

const payload = {
username: "ロトムずかん",
content: message,
};


UrlFetchApp.fetch(WEBHOOK_URL, {
method: "post",
contentType: "application/json",
payload: JSON.stringify(payload),
});
}
}


参考文献

henn6.tokyo

スプレッドシートからクイズ用Googleフォームとクイズ用紙を自動で生成する

ポケモンサークルは新歓や文化祭でクイズを作ることがあると思いますが,クイズを募って厳選するのはともかく,そこからGoogleフォームを作ったりWordやドキュメントで印刷用に整えたりするのは非常に手間だと思います.

そこで,問題文や選択肢をまとめたスプレッドシートから自動でGoogleフォームやドキュメントを生成できるようにしました.これで,クイズを募集する際にはスプレッドシートExcelに書いてもらうことで,まとめる人はコピペするだけで済みます.

どんな感じのフォームやドキュメントができるかは,下の例をご覧ください.ドキュメントは非常にシンプルなので,実際には手直しが必要かもしれません.

docs.google.com

自動生成されるドキュメント

 

実際の生成の仕方

docs.google.com


ファイルから自分のドライブにスクリプトごとコピーし,クイズなど黄色い部分を変更してください.

問題数と選択肢の数は自由に変えられますが,それ以外の問題の項目はすべて埋めてください.

問題形式を変えたい場合は,下の参考文献を読んでください.

右上のフォーム作成ボタンを押せばGoogleフォーム,ドキュメント作成ボタンを押せば印刷用ドキュメントが作成されます.

フォームやドキュメントのURLがスプレッドシートに挿入されるので,そのまま編集ページに飛んだり配布したりできます.

フォームに関しては,設定→成績の発表を送信直後に,回答者が表示できる項目をすべてONに切り替えた方がいいと思います(自動生成では切り替えられないようです).

ドキュメントは非常にシンプルなので,色々変えて見栄えを良くしてください.

 

参考文献

blog.synnex.co.jp

 

Googleフォームで表記ゆれを気にせずポケモンのKPをカウントする

ポケモン対戦の大会を開催する時、結果報告の時にKP(かぶりポイント)を調べることがあると思います。最近はGoogleフォームを使って多少効率化されているようですが、記述式ではスペルミスや表記揺れがあり、最後に訂正する手間がかかっている印象です。

そこで、表記ゆれがないよう,頭文字で絞ってからポケモンを選ぶ方式のGoogleフォームを自動で作れるようにしました.ポケモン名をキーボードで打ち込む必要がないので,スマホからでも簡単に書き込めます.

Googleスプレッドシートと添付されているApps ScriptからGoogleフォームを生成できるようになっています.

アンケート結果も書いてある通りにやればシートに自動で入力されます.

また,集まったデータが見やすく表示されるシートも作ったので,大会のKP集計にそのまま使えます.

使い方はスプレッドシート内の使い方シートに書いてありますが,下にも一応書きます.

それなりに便利だと思うので、是非ポケモンの大会などで使ってみてください。

何かミス等あればコメントください

ポケモンKP(配布用) - Google スプレッドシート

 

使用感を確かめたい人もいると思うので,体験用のGoogleフォームを貼っておきます

forms.gle

こんな感じで回答一覧が出ます

 

集計結果はこんな感じです

 

配布スプレッドシートを使ったGoogleフォームの作り方

 

    1. 上のスプレッドシートを開いてファイル→コピーを作成(添付のスクリプトも)
    2. ポケモンを増やしたり減らしたりする場合,"項目データ"シートをいじってください
    3. Apps Scriptでトリガーを以下のように作成    
          実行する関数: onSubmit
          デプロイ時に実行: Head
          イベントのソース: スプレッドシートから
          イベントの種類: フォーム送信時
    4. create_form_sample関数を実行(5分くらいかかる)    
          自分のアカウントにフォームが作成される
    5. 回答先のスプレッドシートをコピーしたスプレッドシートに選択    
          かなり重いので、デスクトップPCでやりましょう    
          '概要'シートにURLが貼り付けられます
    6. "回答整理"と"集計結果"シートに自動で入力されます

   

参考文献

意地でもGoogleフォームで二段階プルダウンを作りたい。【GAS】 - Qiita