web-dev-qa-db-ja.com

スクリプトを使用して、GoogleスプレッドシートのGoogleフォームからの回答を編集するために使用されるURLを表示する

Googleフォームの編集URLを、添付されている応答Googleシートに自動的に入力しようとしています。 this を既に見たので使用したいのですが、スクリプトを正確に配置する場所を見つけようとすると問題が発生します。

URLを表示したいGoogleスプレッドシートのスクリプトエディターに入れてみましたが、そこからどこに行くべきかわかりません。スクリプトエディターで、アドオンとしてテストしようとしましたが、機能しませんでした。

Googleスプレッドシートのスクリプトとスクリプトエディターの経験はほとんどありません。最後に、同じGoogleスプレッドシートでAutoCratという別のアドオンを使用しています。

10
nicks

簡潔な答え

リンク は、2つの答えがあるが、適切ではないように見えるQ&Aを指します。 I.E.回答の1つのコードが不完全であり、両方ともメールを送信するため、採用は複雑すぎて開始点として使用できません。

以下は採用しやすいスクリプトです。

説明書

  1. テストフォームを作成し、フォームID(URLの../d//editの間)に注意してください。 New form

  2. 新しいスプレッドシートに回答を送信するようにフォームを設定します。 Connect a spreadsheet

  3. 新しいスプレッドシートにリダイレクトされます。アクティブなシート名に注意し(必要に応じて名前を変更)、header応答編集URLを保持するために使用される列、つまりEdit Url。注:大文字の使用は非常に重要です。したがって、大文字と小文字の書き方には非常に注意してください。 Responses spreadsheet

  4. Tools > Script editorに移動して、スプレッドシートにバインドされたGoogle Apps Scriptプロジェクトを追加します。 Spreadsheet scripts

  5. デフォルトのコードを以下のコードに置き換えます(場合に応じてグローバル変数を編集することを忘れないでください)。 Script code

  6. プロジェクトを保存し、インストール可能なフォームサミットトリガーを追加します([承認が必要]ダイアログが表示された場合は、[権限の確認]をクリックしてから[許可]をクリックします)。 Form submit trigger

  7. サンプル応答を送信して、ソリューションをテストします。

コード

/*
 * Global Variables
 */

// Form URL
var formURL = 'https://docs.google.com/forms/d/form-id/viewform';
// Sheet name used as destination of the form responses
var sheetName = 'Form Responses 1';
/*
 * Name of the column to be used to hold the response edit URLs 
 * It should match exactly the header of the related column, 
 * otherwise it will do nothing.
 */
var columnName = 'Edit Url' ;
// Responses starting row
var startRow = 2;

function getEditResponseUrls(){
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
  var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues(); 
  var columnIndex = headers[0].indexOf(columnName);
  var data = sheet.getDataRange().getValues();
  var form = FormApp.openByUrl(formURL);
  for(var i = startRow-1; i < data.length; i++) {
    if(data[i][0] != '' && data[i][columnIndex] == '') {
      var timestamp = data[i][0];
      var formSubmitted = form.getResponses(timestamp);
      if(formSubmitted.length < 1) continue;
      var editResponseUrl = formSubmitted[0].getEditResponseUrl();
      sheet.getRange(i+1, columnIndex+1).setValue(editResponseUrl);
    }
  }
}

追加のリソース

質問と回答の内容で Gist を作成しました。このb/cでは、コードを記述するエンドユーザー間でより良いコラボレーションを行う方法を模索しています。

15
Rubén