Apps Scriptリファレンス: Apps Script Reference |障害・課題追跡: IssueTracker |Google Workspace: Status Dashboard - Summary

2025年5月20日火曜日

Google Formsでスプレッドシートに用意した質問を読み込んでみる(クイズ対応)


今回はGoogleフォームでスプレッドシートからデータを読み込んでクイズを作ります

事前に「質問・選択肢・フィードバック」をスプレッドシートに入力して

それを読み込んでクイズモードのフォームを作ってみます



事前に用意するスプレッドシートの構造
  • A列に質問
  • B列に選択肢
    • 先頭が正解
  • C列に正解のフィードバック
  • D列に不正解のフィードバック



フォームの回答画面




Code.gs
function createQuizzesFromSheet() {
const spreadsheetUrl = 'https://docs.google.com/spreadsheets/d/SPREADSHEET_ID/edit#gid=0';
const formName = 'Simple Quiz from Sheet';
const description = 'Pleas answer the following question';

// スプレッドシートを読み込む
const sheet = SpreadsheetApp.openByUrl(spreadsheetUrl).getSheets()[0];
const [headers, ...rows] = sheet.getDataRange().getValues();

// 列インデックス取得
const colIndex = {
question: headers.indexOf('Question'),
options: headers.indexOf('Options'),
correctFb: headers.indexOf('Correct Feedback'),
incorrectFb: headers.indexOf('Incorrect Feedback')
};

// 新しいフォームを作成
const form = FormApp.create(formName);
form.setDescription(description);
form.setIsQuiz(true);

// 各行のデータから問題を作成
rows.forEach(row => {
const question = row[colIndex.question];
const optionsText = row[colIndex.options];
const correctFb = row[colIndex.correctFb];
const incorrectFb = row[colIndex.incorrectFb];

const options = optionsText
.split('\n')
.map((text, index) => ({
text: text.trim(),
isCorrect: index === 0 // 最初の選択肢を正解に
}));

const item = form.addMultipleChoiceItem();
item.setTitle(question)
.setChoices(options.map(opt => item.createChoice(opt.text, opt.isCorrect)))
.setRequired(true)
.setPoints(10)
.setFeedbackForCorrect(FormApp.createFeedback().setText(correctFb).build())
.setFeedbackForIncorrect(FormApp.createFeedback().setText(incorrectFb).build());
});

form.setPublished(false);

Logger.log('作成されたフォームのURL: ' + form.getEditUrl());
}





上記 Code.gs を実行すると

指定したスプレッドシートからデータを読み込んで

質問・選択肢・解答集に値が入ったフォームが作成されます


フォームの編集画面 > 解答集を作成



Tips 1: 選択肢をシャッフルしたい場合

選択肢もシャッフルしたい場合は Apps Script だけではできないので
事前に選択肢をシャッフルする設定にしたテンプレートのフォームを作って
そのテンプレートをコピーして質問や回答を上書きする

その方法でCode.gsを書き直してみる


Code.gs
function createQuizzesFromSheetByTemplate() {
const spreadsheetUrl = 'https://docs.google.com/spreadsheets/d/SPREADSHEET_ID/edit#gid=0'; // スプレッドシートURL
const templateFormUrl = 'https://docs.google.com/forms/d/FORM_ID/edit'; // テンプレートフォームURL
const formName = 'Quiz from Sheet';
const description = 'Pleas answer the following question';

// --- スプレッドシートを読み込む ---
const sheet = SpreadsheetApp.openByUrl(spreadsheetUrl).getSheets()[0];
const [headers, ...rows] = sheet.getDataRange().getValues();

// ヘッダーインデックス取得(柔軟に対応するため)
const colIndex = {
question: headers.indexOf('Question'),
options: headers.indexOf('Options'),
correctFb: headers.indexOf('Correct Feedback'),
incorrectFb: headers.indexOf('Incorrect Feedback')
};

// --- フォームのテンプレートをコピーして新規作成 ---
const templateFormId = FormApp.openByUrl(templateFormUrl).getId();
const templateFile = DriveApp.getFileById(templateFormId);
const copiedFile = templateFile.makeCopy(formName);
const form = FormApp.openById(copiedFile.getId());

form.setTitle(formName);
form.setDescription(description);
form.setIsQuiz(true);
form.setPublished(false);

// 最初の項目を複製して数を揃える
const original = form.getItems(FormApp.ItemType.MULTIPLE_CHOICE)[0];
for (let i = 1; i < rows.length; i++) {
original.duplicate();
}

const mcItems = form.getItems(FormApp.ItemType.MULTIPLE_CHOICE);

// --- 各行に基づいてフォーム項目を設定 ---
rows.forEach((row, i) => {
const question = row[colIndex.question];
const optionsText = row[colIndex.options];
const correctFb = row[colIndex.correctFb];
const incorrectFb = row[colIndex.incorrectFb];

const options = optionsText
.split('\n')
.map((text, index) => ({
text: text.trim(),
isCorrect: index === 0 // 先頭が正解
}));

const item = mcItems[i].asMultipleChoiceItem();
item.setTitle(question)
.setChoices(options.map(opt => item.createChoice(opt.text, opt.isCorrect)))
.setRequired(true)
.setPoints(10)
.setFeedbackForCorrect(FormApp.createFeedback().setText(correctFb).build())
.setFeedbackForIncorrect(FormApp.createFeedback().setText(incorrectFb).build());
});

form.setPublished(false);

Logger.log('Created Form: ' + form.getEditUrl());
}




Tips 2: アンケートフォームの場合

質問も選択肢もシャッフルしない場合はもっと短く書けます


Code.gs
function createSimpleFormFromSheet() {
const spreadsheetUrl = 'https://docs.google.com/spreadsheets/d/SPREADSHEET_ID/edit#gid=0';
const formName = 'Simple Survey from Sheet';
const description = 'Pleas answer the following question';

// スプレッドシートのデータ取得
const sheet = SpreadsheetApp.openByUrl(spreadsheetUrl).getSheets()[0];
const [headers, ...rows] = sheet.getDataRange().getValues();

const colIndex = {
question: headers.indexOf('Question'),
options: headers.indexOf('Options'),
};

// 新しい通常フォームを作成(クイズではない)
const form = FormApp.create(formName);
form.setDescription(description);

// 各行の質問をフォームに追加
rows.forEach(row => {
const question = row[colIndex.question];
const optionsText = row[colIndex.options];

const options = optionsText
.split('\n')
.map(text => text.trim())
.filter(text => text); // 空行除去

const item = form.addMultipleChoiceItem();
item.setTitle(question)
.setChoiceValues(options)
.setRequired(true);
});

Logger.log('作成されたフォームの編集URL: ' + form.getEditUrl());
}





関連記事



2025年5月19日月曜日

Google Formsで質問の中に画像を配置したい(UI操作)



「質問の外」に画像を追加しました

今回は「質問の中」に画像を追加する方法について書きます



これは Apps Script の FormAppではサポートされていないようなので画面上でやります



質問の編集画面

質問の右端にある「インライン画像を追加」をクリックします



画像の挿入画面で対象の画像を選択して挿入します

今回は手元のPCから画像をアップロードするので「参照」をクリックします



対象の画像を選択して「Open」をクリックします



質問の中に画像が追加されます



「質問の外」と「質問の中」の違いは画像と質問がくっついているか離れているか



Tips

「質問の順序をシャッフルする」場合
  • 「質問の中」に画像を配置すると質問と画像がセットでシャッフルされる
  • 「質問の外」に画像を配置すると画像と質問がバラバラにシャッフルされる

Google Formsで質問の順番をシャッフルしたい(setShuffleQuestions) で書いたような質問に画像を追加する場合は

今回書いたように「質問の中」に配置する必要がある

けれど Apps Script では「質問の中」への画像配置はサポートされていないため

手動で質問に画像を追加することになる



関連記事


2025年5月18日日曜日

Google Formsで選択肢を画像にしたい(ラジオボタン・チェックボックス)


Googleフォームの「ラジオボタン」「チェックボックス」の質問には画像を配置できます


今回は「ラジオボタン」を例に画像付き選択肢を作ってみます



この操作は画面上でのみ行えます

Apps Script の FormAppには同じことを実現するメソッドは用意されていないようです



フォームの編集画面

今回の例の質問と回答
  • 質問: What is the capital of Japan?
  • 選択肢: Tokyo, Osaka, Kyoto, Fukuoka
選択肢の右端にある「画像を追加」アイコンをクリックします


画像の挿入画面が表示されるので対象の画像を選択して挿入します

今回は手元のPCから「アップロード」してみます

画像の挿入 > アップロードで「参照」ボタンをクリックします 


挿入したい画像を選択して「Open」をクリックします

今回の例では Google Maps でそれぞれの都市を事前にスクショして 

Documents に保存したものを使っています


選択肢に画像が追加されます


残りの選択肢にも同じように画像を追加します


フォームの回答画面


フォームの回答画面を開くと画像付きの選択肢が表示されるようになります



Tips

Google Maps でそれぞれの観光地を検索して得た結果をスクショして使いました

2025年5月17日土曜日

Google Formsで過去に作った質問をインポートしたい(UI操作)


Googleフォームでは自分が編集権限を持っている別のフォームから質問を挿入できます

今回は Google Formsで単一選択の質問を作りたい で作ったフォームをベースにして


Google Formsで長文の回答の質問を作りたい にある質問をインポートしてみます



質問をインポートする手順


「フォームの編集画面 > 質問 > 質問をインポート」 をクリックします


対象のフォームを選択して「挿入」をクリックします


インポートしたい質問を選択して「質問をインポート」ボタンをクリックします

今回は質問が一つしないので自動的に「すべて選択」もチェックが入っています



選択した質問がインポートされます



フォームの回答画面




Reference

フォームを編集する > 以前のフォームの質問を再利用する

Google フォームで既存フォームから新規フォームへの質問のインポートが可能に

2025年5月16日金曜日

Google Formsの回答結果をスプレッドシートに書き出したい(setDestination)


Googleフォームの回答結果はフォームの編集画面でも確認できますが

スプレッドシートに書き出すこともできます


今回試したこと
  • アンケートフォームとクイズフォームでスプレッドシートに書き出してみる
  • 書き出すスプレッドシートは新規作成と既存のもので試してみる


アンケートフォームの場合

ここでは Google Formsで単一選択の質問を作りたい で作ったフォームを公開して使います


事前に10件ほど回答を送信しておきます

スプレッドシートに書き出すには

回答の要約画面で「スプレッドシートにリンク」をクリックします


回答の送信先選択画面では2つの選択肢があります
  • 新しいスプレッドシートを作成
  • 既存のスプレッドシートを選択
今回は「新しいスプレッドシートを作成」にして「作成」をクリックします



新規のスプレッドシートが作成されて1行ずつ回答が書き込まれます




クイズフォームの場合

Google Formsで複数の質問と選択肢の順番を毎回シャッフルしたい(Apps Script) を例に使います


フォームを公開して上記と同じく10件ほど回答を送信しておきます

「スプレッドシートにリンク」をクリックします


今回は「既存のスプレッドシートを選択」して「選択」をクリックしてみます


先ほど新規作成したスプレッドシートを選択して「挿入」をクリックします



先ほどと同じスプレッドシートが開いて「フォームの回答2」タブが追加されます

そこにクイズの回答結果が一行ずつ書き込まれます


このように既存のスプレッドシートを紐づけることもできますが

基本的には一つのフォームには一つのスプレッドシートを紐づけることになると思います



Apps Script で作成する場合

以下の Code.gs は Google Formsで単一選択の質問を作りたい  で書いたコードをベースに

「新しいスプレッドシートを作成」する
const sheet = SpreadsheetApp.create(formName + ' Responses') と

フォームにスプレッドシートをリンクする
form.setDestination(FormApp.DestinationType.SPREADSHEET, sheet.getId()) を追加したものです

createMultipleChoiceWithSheet() を実行すると

回答を書き込むスプレッドシートが紐づいたフォームが作成されます



Code.gs
function createMultipleChoiceWithSheet() {
const formName = 'Favorite Color Survey';
const description = 'Please tell us your favorite color.';
const title = 'What is your favorite color?';
const color = ['Red', 'Blue', 'Green', 'Yellow'];

// フォームの作成
const form = FormApp.create(formName);
form.setDescription(description);

// 質問の追加
const item = form.addMultipleChoiceItem();
item.setTitle(title)
.setChoiceValues(color)
.showOtherOption(true) // 「その他」を表示
.setRequired(false);

// 回答先スプレッドシートを新規作成
const sheet = SpreadsheetApp.create(formName + ' Responses');

// フォームにスプレッドシートをリンク
form.setDestination(FormApp.DestinationType.SPREADSHEET, sheet.getId());

// フォームの非公開設定
form.setPublished(false); // ※非公開状態にしたい場合(フォームAppの動作には影響しない)

// URL出力
Logger.log('Form Edit URL: ' + form.getEditUrl());
Logger.log('Response Sheet URL: ' + sheet.getUrl());
}




Tips

既存のシートに紐づける場合は

下記 Code.gs の existingSheetUrl の値に対象のスプレッドシートURLを入れて

const existingSheetId = SpreadsheetApp.openByUrl(existingSheetUrl).getId() と

form.setDestination(FormApp.DestinationType.SPREADSHEET, existingSheetId) を追加します

(手動でURLからIDを抽出する場合はopenByIdで直接IDを指定するとコードは短くなる)


Code.gs
function createMultipleChoiceWithExistingSheet() {
const formName = 'Favorite Color Survey';
const description = 'Please tell us your favorite color.';
const title = 'What is your favorite color?';
const color = ['Red', 'Blue', 'Green', 'Yellow'];
const existingSheetUrl = 'https://docs.google.com/spreadsheets/d/SPREADSHEET_ID/edit';

// フォームの作成
const form = FormApp.create(formName);
form.setDescription(description);

// 質問の追加
const item = form.addMultipleChoiceItem();
item.setTitle(title)
.setChoiceValues(color)
.showOtherOption(true) // 「その他」を表示
.setRequired(false);

// 既存のスプレッドシートID
const existingSheetId = SpreadsheetApp.openByUrl(existingSheetUrl).getId();

// フォームに既存のスプレッドシートをリンク
form.setDestination(FormApp.DestinationType.SPREADSHEET, existingSheetId);

// フォームの非公開設定
form.setPublished(false);

// ログ出力
Logger.log('Form Edit URL: ' + form.getEditUrl());
Logger.log('Linked Response Sheet URL: https://docs.google.com/spreadsheets/d/' + existingSheetId);
}


2025年5月15日木曜日

Google Formsで入力済のフォームを作りたい(UI操作)


Googleフォームでは事前入力したフォームを作って共有することができます

公式のガイドでは
毎日のタスクや評価など、同じフォームの質問を繰り返し使用する場合は、フォームの一部に事前に回答を入力して送信すれば、より速く回答を終えることができます。
と書かれていました


今回はその使用方法とは異なりますが


で作ったクイズモードのフォームを使って

答えが選択されているフォームを作ってみます


ちなみに この機能は Apps Script の FormApp ではサポートされていないようです→下記Tips



事前入力の手順


フォームの編集画面で右上の︙メニューから「フォームに事前入力する」を選びます



正解を選択して「リンクを取得」をクリックします



下部に現れる「リンクをコピー」ボタンをクリックします



コピーしたリンクにアクセスすると

正解が選択されたフォームが開きます




Tips: Apps Script ではサポートされていないことの確認

事前入力したフォームで「リンクをコピー」したURLをみるとパラメータがついていました
(フォームを開くとパラメーターはなくなる)

事前入力していない通常フォームのURL


事前入力したフォームのURL


URLパラメーター
?usp=pp_url&entry.581433162=Tokyo&entry.1223252323=Canberra

その中の Tokyo や Canberra を Kyoto や Sydney など他の選択肢に変えると

事前入力のフォームでも変更した値が選択されました


URLパラメーターの中にある 581433162 や 1223252323 が質問を特定しているっぽい

Developer Tools で質問の要素を見ていくと
input要素のname属性に entry.1223252323_sentinel という値が入っていました



けれどその値は Apps Script では取得できないみたいです


Apps Script では質問のIDを取得することができるので

フォーム内にある2つの質問のIDを取得してみましたが 

581433162 や 1223252323 は返ってきませんでした

Google Formの質問項目を取得する の get_items() で出力したログ
[
{
"id": 1105145940,
"type": "MULTIPLE_CHOICE",
"index": 0.0,
"title": "What is the capital of Japan?",
"text": null
},
{
"type": "MULTIPLE_CHOICE",
"index": 1.0,
"id": 1381537534,
"title": "What is the capital of Australia?",
"text": null
}
]



Reference

Pre-fill answers in a form



関連記事


Google Formの質問項目を取得する 

Google Formsのフォントや色をカスタマイズしたい(UI操作)


Googleフォームではテーマをカスタマイズしてヘッダー画像や色やフォントを設定できます


今回は Google Formsで単一選択の質問を作りたい で作ったフォームをベースに

テーマをカスタマイズしていきます



テーマをカスタマイズ

フォームの編集画面で上部メニューから「テーマをカスタマイズ」をクリックすると

左側にテーマの設定項目が表示されます





テキストスタイルを変えてみる

テキストスタイルでは文字の種類や大きさを変更できます


「ヘッダー・質問・テキスト」の値を変更するとフォームに反映されます




ヘッダーを変えてみる

ヘッダーの「画像選択」をクリックするとテーマの画像を選択画面が表示されます

テーマ > ヘッダー > 画像を選択



使いたい画像を選択して「挿入」をクリックします



上部に画像が追加されてフォーム全体の色が変わります





色と背景色を変えてみる

ヘッダーの画像を選択したら使える色が限定されます


その中から変えたい色と背景色を選択します



「色」がわかりにくいですが
フォームのタイトルの上のバーの色がピンク色からオレンジ色に変わっています



公開したフォーム




Tips

Apps Script(FormApp)でフォームのテーマ(色やフォントなど)をカスタマイズすることはできないようです



Reference

フォームのテーマやフォントを変更する

Google Formsで単一選択の質問を作りたい

Latest post

スプレッドシートの空白セルを直前の値で埋めたい

A列の空白セルに直前の値を入れたくて書いたコードです スプレッドシートに以下のようなBeforeの表があるとき (A列に空白セルがある) Before 1 A B 2 エリア 都市 3 東京 新宿 4 渋谷 5 池袋 6 神奈川 横浜 7 川崎 8 相模原 9 千葉 千葉 10 ...