GASでGoogleフォームのリンク先をまとめて変更!タブ(シート)名もフォームのタイトルに合わせる方法
- Googleフォームのリンク先をまとめて変更したい方
- Googleフォームのタブ名をまとめて変更したい方
Googleフォームは便利ですが、フォームが増えるとどのスプレッドシートとリンクしているのか分からなくなることありませんか?
フォームのリンク先が散らばると管理が大変で、複数のリンク先を一つのスプレッドシートにまとめ直すのも手動では時間がかかります。
そんな時に役立つのが、Google Apps Script (GAS) です。
GASを使えば、Googleフォームとスプレッドシートのリンク先をまとめて変更することができます。
また、リンクした新しいスプレッドシート内のGoogleフォームタブ名もGASで変更できます。
この記事では、GASを使ってGoogleフォームのリンク先とタブ名をまとめて変更する方法をご紹介します。
完成イメージ
1. Googleドライブ内にあるGoogleフォームのURL一覧を取得
2. 選択したGoogleフォームを指定のスプレッドシートにリンク
3. Googleフォームのタブ名をまとめて変更
今回使用するGASは3つ
今回の自動化プロセスでは、Googleフォームとスプレッドシートを効率的に連携し、以下のことが実現できます。
フォームのリンク先変更を自動化:
フォームの回答データが格納されるリンク先スプレッドシートをGASを使って簡単に変更できます。
タブ名の変更を自動化
Googleフォームが新しいリンク先に変更された後、もう一つのGASを実行してタブ名をフォームのタイトルに基づいて設定します。
手作業によるリンク変更やタブ名の設定の手間が省け、複数のフォームを扱う際の効率が向上します。
以下でそれぞれの手順をご説明します。
GAS1:Googleドライブ内にあるGoogleフォームのURL一覧を取得
Googleドライブ内にあるすべてのGoogleフォームのURLを取得し、スプレッドシートに一覧で出力します。
これにより、リンク先変更が必要なGoogleフォームを選択できるようになります。
項目の入力(例)
A列からC列の項目名 | |
---|---|
A3 | 新しいリンク先 |
A5 | ファイル名 |
B5 | URL |
C5 | チェック |
GoogleフォームのURL一覧を表示させるため、スプレッドシートに必要な項目を入力します。
C列のチェックボックスはメニューの「挿入」-「チェックボックス」で作成できます。
また、今回の例ではタブ名を「Googleフォーム一覧」として、GAS実行の際に参照します。
Googleスプレッドシートを開き、メニューの「拡張機能」から「Apps Script」をクリックしてGASエディタを開きます。
function myFunction(){
}
が最初から入っているため、消去して以下のスクリプトを貼り付けます。
function listGoogleForms() {
// スプレッドシートを取得し、"Googleフォーム一覧"シートをアクティブにする
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Googleフォーム一覧");
if (!sheet) {
// シートが存在しない場合はエラーメッセージを表示
Logger.log("シート 'Googleフォーム一覧' が見つかりません");
return;
}
// 検索条件を指定してGoogleドライブ内のGoogleフォームを取得
var searchQuery = "mimeType = 'application/vnd.google-apps.form'"; // GoogleフォームのMIMEタイプ
var files = DriveApp.searchFiles(searchQuery);
var row = 6; // A6セルからファイル名を挿入
// ファイルを一つずつループして、名前とURLを取得
while (files.hasNext()) {
var file = files.next();
var fileName = file.getName(); // ファイル名
var fileUrl = file.getUrl(); // ファイルのURL
// ファイル名をA列、URLをB列に入力
sheet.getRange(row, 1).setValue(fileName);
sheet.getRange(row, 2).setValue(fileUrl);
row++; // 次の行に進む
}
}
スクリプトの説明
- スプレッドシートの取得
-
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Googleフォーム一覧");
- 現在アクティブなスプレッドシートから「Googleフォーム一覧」という名前のタブを取得します。このタブにGoogleフォームの一覧を出力します。
- タブが存在しない場合の処理
-
if (!sheet) { Logger.log("シート 'Googleフォーム一覧' が見つかりません"); return; }
- 指定されたタブが存在しない場合、ログにエラーメッセージを記録し、スクリプトを終了します。
- Googleドライブ内のGoogleフォームを取得
-
var searchQuery = "mimeType = 'application/vnd.google-apps.form'"; var files = DriveApp.searchFiles(searchQuery);
- Googleドライブ内のファイルのうち、MIMEタイプが
'application/vnd.google-apps.form'
であるもの、つまりGoogleフォームを検索します。 DriveApp.searchFiles(searchQuery)
により、条件に一致するファイルを取得します。
- Googleドライブ内のファイルのうち、MIMEタイプが
- ファイル情報のシートへの書き込み
-
var row = 6; // A6セルからファイル名を挿入
- スプレッドシートの6行目からデータを記載します。この設定により、ファイル名とリンクをA列とB列に挿入していきます。
- ループでファイル名とURLを取得
-
while (files.hasNext()) { var file = files.next(); var fileName = file.getName(); // ファイル名 var fileUrl = file.getUrl(); // ファイルのURL // ファイル名をA列、URLをB列に入力 sheet.getRange(row, 1).setValue(fileName); sheet.getRange(row, 2).setValue(fileUrl); row++; // 次の行に進む }
while
ループを使用して、検索結果からすべてのファイルを順番に処理します。file.getName()
でファイル名、file.getUrl()
でファイルのURLを取得します。- それらの情報をスプレッドシートのA列(ファイル名)とB列(URL)に記載します。データを書き込んだ後、次の行に進むために
row
をインクリメント(数値を1つ増やす)しています。
コードを書いたら、名前をつけて保存します。
(例:「Googleフォーム一覧」)
スクリプトを実行して、Googleドライブ内のGoogleフォームのリンクを取得します。
初めてそのスクリプトを実行する場合は権限の確認が必要です。
そのため、『権限を確認』を押します。
許可の詳細手順
「詳細」をクリックします。
「無題のプロジェクト(安全ではないページ)に移動」をクリックします。
「許可」をクリックします。
GAS2:選択したGoogleフォームを指定のスプレッドシートにリンク
複数のフォームを指定したスプレッドシートにまとめてリンク先変更することで、データ管理を簡単にします。
スプレッドシートのC列にあるチェックボックスを利用して、リンク先を変更したいGoogleフォームを選択します。
チェック後、B3セルに新たにリンクさせたいスプレッドシートのURLもしくはIDを貼り付けます。
先ほどと同様にGASエディタを開きます。
メニューの「拡張機能」から「Apps Script」を選択し、GASエディタを開きます。
以下のスクリプトを貼り付けます。
function myFunction(){
}
が最初から入っているため、消去して以下のスクリプトを貼り付けます。
function changeFormDestinationAndRenameSheet() {
// 現在のスプレッドシートを取得
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Googleフォーム一覧');
// B2セルから新しいスプレッドシートのURLまたはIDを取得
let newSpreadsheetId = sheet.getRange('B3').getValue();
// B2セルがURLの場合、IDを抽出
const match = newSpreadsheetId.match(/\/d\/([^\/]+)\//);
if (match) {
newSpreadsheetId = match[1];
}
// 新しいスプレッドシートを取得
const newSpreadsheet = SpreadsheetApp.openById(newSpreadsheetId);
// B列とC列の6行目以降のデータを取得
const formUrls = sheet.getRange('B6:B').getValues().flat();
const checkboxes = sheet.getRange('C6:C').getValues().flat();
// フォームURLごとにチェックボックスの状態を確認し、チェックが入っている場合のみ処理を行う
formUrls.forEach((url, index) => {
if (checkboxes[index]) { // チェックが入っている場合
try {
if (url) {
// フォームIDをURLから抽出
const formId = url.match(/\/d\/([^\/]+)\//)[1];
// フォームを取得
const form = FormApp.openById(formId);
// リンクを変更する前の既存のシート名リストを取得
const existingSheetNames = newSpreadsheet.getSheets().map(sheet => sheet.getName());
// 新しいスプレッドシートにリンクする
form.setDestination(FormApp.DestinationType.SPREADSHEET, newSpreadsheet.getId());
// 新しいシートが作成されるのを確認
const updatedSheets = newSpreadsheet.getSheets();
let newSheet;
for (let sheet of updatedSheets) {
if (!existingSheetNames.includes(sheet.getName())) {
newSheet = sheet;
break;
}
}
// 新しいシートが存在する場合、シート名を変更
if (newSheet) {
let formTitle = form.getTitle();
// シート名の重複をチェックしてユニークな名前を作成
let uniqueTitle = formTitle;
let counter = 1;
while (newSpreadsheet.getSheetByName(uniqueTitle)) {
uniqueTitle = `${formTitle} (${counter})`;
counter++;
}
// シートの名前をユニークなタイトルに変更
newSheet.setName(uniqueTitle);
Logger.log(`フォームID ${formId} のリンク先を新しいスプレッドシートに変更し、新しく作成されたシート名を「${uniqueTitle}」に変更しました。`);
} else {
Logger.log(`フォームID ${formId} のリンク先を変更しましたが、新しいシートを見つけることができませんでした。`);
}
}
} catch (e) {
Logger.log(`フォームURL ${url} の処理中にエラーが発生しました: ${e.message}`);
}
} else {
Logger.log(`行 ${index + 6} のフォームはチェックされていないため、スキップされました。`);
}
});
}
スクリプトの説明
- スプレッドシートの取得
-
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Googleフォーム一覧');
- 現在アクティブなスプレッドシートから「Googleフォーム一覧」という名前のタブを取得します。
- 新しいリンク先スプレッドシートIDの取得
-
let newSpreadsheetId = sheet.getRange('B3').getValue(); const match = newSpreadsheetId.match(/\/d\/([^\/]+)\//); if (match) { newSpreadsheetId = match[1]; }
- B3セルから、新しいリンク先スプレッドシートのURLまたはIDを取得します。
- B3セルにURLが入力されている場合、正規表現を使用してURLからスプレッドシートIDを抽出します。
- 新しいスプレッドシートの取得
-
const newSpreadsheet = SpreadsheetApp.openById(newSpreadsheetId);
- 抽出したスプレッドシートIDを使用して、新しいスプレッドシートを取得します。
- フォームURLとチェックボックスの状態を取得
-
const formUrls = sheet.getRange('B6:B').getValues().flat(); const checkboxes = sheet.getRange('C6:C').getValues().flat();
- B列の6行目以降からGoogleフォームのURL、C列の6行目以降からチェックボックスの状態を取得します。
- フォームごとの処理(リンク先変更)
-
formUrls.forEach((url, index) => { if (checkboxes[index]) { try { if (url) { // フォームIDをURLから抽出 const formId = url.match(/\/d\/([^\/]+)\//)[1]; // フォームを取得 const form = FormApp.openById(formId); // リンクを変更する前の既存のシート名リストを取得 const existingSheetNames = newSpreadsheet.getSheets().map(sheet => sheet.getName()); // 新しいスプレッドシートにリンクする form.setDestination(FormApp.DestinationType.SPREADSHEET, newSpreadsheet.getId()); // 新しいシートが作成されるのを確認 const updatedSheets = newSpreadsheet.getSheets(); let newSheet; for (let sheet of updatedSheets) { if (!existingSheetNames.includes(sheet.getName())) { newSheet = sheet; break; } } // 新しいシートが存在する場合、シート名を変更 if (newSheet) { let formTitle = form.getTitle(); // シート名の重複をチェックしてユニークな名前を作成 let uniqueTitle = formTitle; let counter = 1; while (newSpreadsheet.getSheetByName(uniqueTitle)) { uniqueTitle = `${formTitle} (${counter})`; counter++; } // シートの名前をユニークなタイトルに変更 newSheet.setName(uniqueTitle); Logger.log(`フォームID ${formId} のリンク先を新しいスプレッドシートに変更し、新しく作成されたシート名を「${uniqueTitle}」に変更しました。`); } else { Logger.log(`フォームID ${formId} のリンク先を変更しましたが、新しいシートを見つけることができませんでした。`); } } } catch (e) { Logger.log(`フォームURL ${url} の処理中にエラーが発生しました: ${e.message}`); } } else { Logger.log(`行 ${index + 6} のフォームはチェックされていないため、スキップされました。`); } });
forEach
ループを使用して、フォームのURLごとに処理を行います。- C列にチェックが入っている場合のみ、リンク先の変更処理を行います。
- URLからフォームIDを抽出し、
FormApp.openById()
を使ってGoogleフォームを取得します。 - 新しいスプレッドシートにリンク先を変更し、その際に新しく作成されたタブがあればタブ名を変更します。
- タブ名を変更する際、他のタブ名と重複しないようにユニークな名前を設定します(例えば、
フォームタイトル (1)
のように)。
コードを書いたら、名前をつけて保存します。
(例:「Googleフォーム リンク先変更」)
スクリプトを実行すると、選択したフォームが新しいスプレッドシートにリンクされます。
チェックボックスにチェックが入ったフォームのみが処理の対象になるので、リンク先を変更したいフォームだけを選択することができます。
ですが、この段階ではリンクしたタブ名は「フォームの回答 (番号)」となっています。
そのため、次に紹介するGASでタブ名を変更します。
GAS3:Googleフォームのタブ名をまとめて変更
フォームのリンク先を変更した後、「フォームの回答(番号)」となっているタブ名をフォームのタイトルに基づいて自動的に設定します。
これにより、各タブがどのフォームのデータなのか分かります。
リンク先の変更と同様にC列のチェックを付けたままにします。
先ほどと同様にGASエディタを開きます。
メニューの「拡張機能」から「Apps Script」を選択し、GASエディタを開きます。
以下のスクリプトを貼り付けます。
function myFunction(){
}
が最初から入っているため、消去して以下のスクリプトを貼り付けます。
function renameSheetsInSpecifiedSpreadsheet() {
// 現在のスプレッドシートを取得
const mainSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Googleフォーム一覧');
// B2セルからスプレッドシートのIDを取得
const spreadsheetId = mainSheet.getRange('B3').getValue();
if (!spreadsheetId) {
Logger.log('B2セルにIDが入力されていません。処理を中止します。');
return;
}
// 指定されたスプレッドシートを取得
const spreadsheet = SpreadsheetApp.openById(spreadsheetId);
const sheets = spreadsheet.getSheets();
sheets.forEach(sheet => {
try {
// シートにリンクされたフォームURLを取得する
const formUrl = sheet.getFormUrl();
if (formUrl) {
// フォームのIDをURLから抽出
const formId = formUrl.match(/\/d\/([^\/]+)\//)[1];
const form = FormApp.openById(formId);
// フォームのタイトルを取得
let formTitle = form.getTitle();
// シート名の重複をチェック
let uniqueTitle = formTitle;
let counter = 1;
while (spreadsheet.getSheetByName(uniqueTitle)) {
uniqueTitle = `${formTitle} (${counter})`;
counter++;
}
// シートの名前をユニークなタイトルに変更
sheet.setName(uniqueTitle);
Logger.log(`シート「${sheet.getName()}」をフォームのタイトル「${uniqueTitle}」に変更しました。`);
} else {
Logger.log(`シート「${sheet.getName()}」にはリンクされたフォームがありません。スキップします。`);
}
} catch (e) {
Logger.log(`シート「${sheet.getName()}」の処理中にエラーが発生しました: ${e.message}`);
}
});
}
スクリプトの説明
- 現在のスプレッドシートから情報を取得
-
const mainSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Googleフォーム一覧');
- アクティブなスプレッドシートから、「Googleフォーム一覧」という名前のタブを取得します。
- B3セルからスプレッドシートIDの取得
-
const spreadsheetId = mainSheet.getRange('B3').getValue();
- B3セルから、操作対象となるスプレッドシートのIDを取得します。このIDを使って、リンク先のスプレッドシートを開きます。
- スプレッドシートIDの確認
-
if (!spreadsheetId) { Logger.log('B2セルにIDが入力されていません。処理を中止します。'); return; }
- スプレッドシートIDが存在しない場合、ログにメッセージを出力してスクリプトの実行を停止します。
- スプレッドシートの取得
-
const spreadsheet = SpreadsheetApp.openById(spreadsheetId); const sheets = spreadsheet.getSheets();
- 取得したスプレッドシートIDを使って、指定されたスプレッドシートを開きます。
- すべてのタブを配列として取得します。
- 各シートの名前変更
-
sheets.forEach(sheet => { try { // シートにリンクされたフォームURLを取得する const formUrl = sheet.getFormUrl(); if (formUrl) { // フォームのIDをURLから抽出 const formId = formUrl.match(/\/d\/([^\/]+)\//)[1]; const form = FormApp.openById(formId); // フォームのタイトルを取得 let formTitle = form.getTitle(); // シート名の重複をチェック let uniqueTitle = formTitle; let counter = 1; while (spreadsheet.getSheetByName(uniqueTitle)) { uniqueTitle = `${formTitle} (${counter})`; counter++; } // シートの名前をユニークなタイトルに変更 sheet.setName(uniqueTitle); Logger.log(`シート「${sheet.getName()}」をフォームのタイトル「${uniqueTitle}」に変更しました。`); } else { Logger.log(`シート「${sheet.getName()}」にはリンクされたフォームがありません。スキップします。`); } } catch (e) { Logger.log(`シート「${sheet.getName()}」の処理中にエラーが発生しました: ${e.message}`); } });
- フォームURLの取得:
各シートにリンクされたフォームのURLを取得します(sheet.getFormUrl()
)。 - フォームIDの抽出とフォームの取得:
フォームURLからフォームIDを抽出し、そのフォームを取得します。 - フォームタイトルの取得とシート名の重複確認:
フォームのタイトルを取得し、そのタイトルをシートの新しい名前として設定します。
もし同じ名前のシートがすでに存在する場合には、(1)
のように番号を付けてユニークな名前にします。 - シート名の変更:
シートの名前を、取得したフォームタイトル(重複がないように調整したもの)に変更します。 - エラーハンドリング:
try-catch
文を使って、処理中にエラーが発生した場合にログにエラーメッセージを記録します。
- フォームURLの取得:
コードを書いたら、名前をつけて保存します。
(例:「Googleフォーム タブ名の変更」)
スクリプトを実行すると、選択したフォームのタブ名が変更されます。
スプレッドシートIDやフォームIDが見つからないエラーが起きる場合は、B3セルのURLや各フォームURLが正しいことを再度確認します。
まとめ
GASを使うことで、Googleフォームとスプレッドシートのリンク先の変更とタブ名の設定を自動化できます。
このスクリプトを使えば、複数のフォームを管理する際の面倒な作業を減らし、より重要な業務に集中できるようになります。
ぜひ、ご活用ください。
弊社では、Google Apps Script(GAS)を活用した業務効率化のサポートを提供しております。
GASのカスタマイズやエラー対応にお困りの際は、ぜひお気軽にご相談ください。
また、ITツールの導入支援やIT導入補助金の申請サポートも行っております。
貴方の業務改善を全力でサポートいたします。
コメント