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フォームを選択できるようになります。

STEP
スプレッドシートに必要情報の入力

項目の入力(例)

A列からC列の項目名
A3新しいリンク先
A5ファイル名
B5URL
C5チェック

GoogleフォームのURL一覧を表示させるため、スプレッドシートに必要な項目を入力します。

C列のチェックボックスはメニューの「挿入」-「チェックボックス」で作成できます。

また、今回の例ではタブ名を「Googleフォーム一覧」として、GAS実行の際に参照します。

STEP
GASエディタを開く

Googleスプレッドシートを開き、メニューの「拡張機能」から「Apps Script」をクリックしてGASエディタを開きます。

STEP
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) により、条件に一致するファイルを取得します。
ファイル情報のシートへの書き込み
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つ増やす)しています。
STEP
スクリプトを保存

コードを書いたら、名前をつけて保存します。

(例:「Googleフォーム一覧」)

STEP
スクリプトを実行

スクリプトを実行して、Googleドライブ内のGoogleフォームのリンクを取得します。

初めてそのスクリプトを実行する場合は権限の確認が必要です。

そのため、『権限を確認』を押します。

許可の詳細手順

「詳細」をクリックします。

無題のプロジェクト(安全ではないページ)に移動」をクリックします。

許可」をクリックします。

GAS2:選択したGoogleフォームを指定のスプレッドシートにリンク

複数のフォームを指定したスプレッドシートにまとめてリンク先変更することで、データ管理を簡単にします。

STEP
リンク先を変更したいGoogleフォームを選択

スプレッドシートのC列にあるチェックボックスを利用して、リンク先を変更したいGoogleフォームを選択します。

チェック後、B3セルに新たにリンクさせたいスプレッドシートのURLもしくはIDを貼り付けます。

STEP
GASエディタを開く

先ほどと同様にGASエディタを開きます。

メニューの「拡張機能」から「Apps Script」を選択し、GASエディタを開きます。
STEP
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) のように)。
STEP
スクリプトを保存
コードを書いたら、名前をつけて保存します。

(例:「Googleフォーム リンク先変更」)

STEP
スクリプトを実行

スクリプトを実行すると、選択したフォームが新しいスプレッドシートにリンクされます。

チェックボックスにチェックが入ったフォームのみが処理の対象になるので、リンク先を変更したいフォームだけを選択することができます。

ですが、この段階ではリンクしたタブ名は「フォームの回答 (番号)」となっています。

そのため、次に紹介するGASでタブ名を変更します。

GAS3:Googleフォームのタブ名をまとめて変更

フォームのリンク先を変更した後、「フォームの回答(番号)」となっているタブ名をフォームのタイトルに基づいて自動的に設定します。

これにより、各タブがどのフォームのデータなのか分かります。

STEP
タブ名を変更したいGoogleフォームを選択

リンク先の変更と同様にC列のチェックを付けたままにします。

STEP
GASエディタを開く

先ほどと同様にGASエディタを開きます。

メニューの「拡張機能」から「Apps Script」を選択し、GASエディタを開きます。
STEP
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 文を使って、処理中にエラーが発生した場合にログにエラーメッセージを記録します。
STEP
スクリプトを保存
コードを書いたら、名前をつけて保存します。

(例:「Googleフォーム タブ名の変更」)

STEP
スクリプトを実行

スクリプトを実行すると、選択したフォームのタブ名が変更されます。

スプレッドシートIDやフォームIDが見つからないエラーが起きる場合は、B3セルのURLや各フォームURLが正しいことを再度確認します。

まとめ

GASを使うことで、Googleフォームとスプレッドシートのリンク先の変更とタブ名の設定を自動化できます。

このスクリプトを使えば、複数のフォームを管理する際の面倒な作業を減らし、より重要な業務に集中できるようになります。

ぜひ、ご活用ください。

弊社では、Google Apps Script(GAS)を活用した業務効率化のサポートを提供しております。

GASのカスタマイズやエラー対応にお困りの際は、ぜひお気軽にご相談ください。

また、ITツールの導入支援やIT導入補助金の申請サポートも行っております。

貴方の業務改善を全力でサポートいたします。

お問い合わせはこちら

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次