2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【GAS】グーグルフォームとリンクしたスプレッドシートの名前を変更する

Posted at

Google App ScriptでGoogle Formにリンクしたスプレッドシートを作る

Google App ScriptでGoogle Formとリンクしたスプレッドシートを作成するのは簡単にできる。

function main(){
    var ss = SpreadsheetApp.getActive();//スプレッドシートを取得
    var form = FormApp.create("テストフォーム");//フォームを作成
    form.setDestination(FormApp.DestinationType.SPREADSHEET,ss.getId());//フォームの保存先をスプレッドシートに指定
}

しかし、シートの名前がフォームの回答1となっており、センスがない。これを変えるために、現在スプレッドシートに存在しているシートをすべて取得し、その中で、フォームと関連づけられているシートを返す関数を作成する。

function getFormSheet(){//google formとリンクしたシートを返す
  var ss = SpreadsheetApp.getActive();
  for (sheet of ss.getSheets()){
    if (sheet.getFormUrl()){
      return sheet;
    }
  }
  return null;
}

sheet.getFormUrl()で、シートに関連付けられたフォームのURLを取得している。関連づけられていない場合はnullが返ってくる。これを利用して、グーグルフォームとリンクしたシートを取得できる。
よって、以下のようなプログラムを作成して、シート名の変更を試みる。

function main(){
    var ss = SpreadsheetApp.getActive();//スプレッドシートを取得
    var form = FormApp.create("テストフォーム");//フォームを作成
    form.setDestination(FormApp.DestinationType.SPREADSHEET,ss.getId());//フォームの保存先をスプレッドシートに指定
    var form_sheet = getFormSheet();
    form_sheet.setName("フォーム用シート");
}

これで、いけるかと思いきや正しく取得できない!!。
1回目の実行ではform_sheetがnullが返ってくることで、form_sheet.setName("フォーム用シート")でエラーが発生する。

なんで??

っていろいろ調べると、getFormSheet関数内で取得しているスプレッドシート一覧にフォームの回答1という名前が含まれていないということが判明した。

はっ??

と思って、getFormSheet()のみをもう一度実行してみると、なんと、フォームと対応したシートが正しく返ってくる。

ワケガワカラナイ...

と思いながらも、フォームのような外部クラスのプログラムからスプレッドシートを操作すると更新が遅れるタイプかな?と思ったので、Utility.sleep(30000)とか遅らせてみたがダメ。
そこで、更新系のメソッドないかなぁ~とドキュメントを眺めてると、なんとそれらしいSpreadsheetApp.flush()を発見!!

function getFormSheet(){//google formとリンクしたシートを返す
  var ss = SpreadsheetApp.getActive();
  SpreadsheetApp.flush();
  for (sheet of ss.getSheets()){
    Logger.log(sheet.getName());
    if (sheet.getFormUrl()){
      return sheet;
    }
  }
  return null;
}

getFormSheet()SpreadsheetApp.flush()を追加することで、1回目の実行でもgetFormSheet()が正しく返ってくることが確認できた。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?