3

Google フォームの応答シートと対話するスクリプトに取り組んでいます。

FormApp.getActiveForm().getDestinationId()

スプレッドシート ID を教えてください。しかし、シート自体を取得する方法が見つかりません。ユーザーはその名前と位置を変更できるため、次のように ID を取得する必要があります。

Sheet.getSheetId()

また、応答が使用する列の数も決定する必要があります。フォーム内の質問の数と等しくありません。次の形式でアイテムの数を数えることができます。

Form.getItems().length

次に、gridItems を検索し、それぞれの行数を追加して、マイナス 1 を追加します。

+ gridItem.getRows().length - 1

最後に、各質問をシートの各列に関連付ける方法はないと思いますが、何らかの方法で列名と項目のタイトルを比較することによって行います。

ありがとうございました

4

4 に答える 4

5

2017 年にクラスにSheet#getFormUrl()追加された を使用して、複数のリンクされたフォームを含む Google スプレッドシート ファイル内のどのシートが現在のフォームに対応するかを確認する方法があります。Sheet

function getFormResponseSheet_(wkbkId, formUrl) {
  const matches = SpreadsheetApp.openById(wkbkId).getSheets().filter(
    function (sheet) {
      return sheet.getFormUrl() === formUrl;
    });
  return matches[0]; // a `Sheet` or `undefined`
}
function foo() {
  const form = FormApp.getActiveForm();
  const destSheet = getFormResponseSheet_(form.getDestinationId(), form.getPublishedUrl());
  if (!destSheet)
    throw new Error("No sheets in destination with form url '" + form.getPublishedUrl() + "'");
  // do stuff with the linked response destination sheet.
}

getDestinationIdフォームと宛先スプレッドシートのリンクを解除した場合は、明らかにまたはを使用できませんgetFormUrl

于 2018-07-23T17:17:52.213 に答える
0

スプレッドシートを取得するには、DestinationID を取得したら、SpreadsheetApp.openById()を使用します。それができたら、名前に関係なく、シートの配列を取得し、インデックスで応答シートを取得できます。

var destId = FormApp.getActiveForm().getDestinationId();
var ss = SpreadsheetApp.openById(destId);
var respSheet = ss.getSheets()[0];  // Forms typically go into sheet 0.
...

この時点から、他の Spreadsheet Service メソッドを使用して、スプレッドシート内のデータを操作できます。

また、応答が使用する列の数も決定する必要があります。フォーム内の質問の数と等しくありません。フォーム内のアイテムの数を数えることはできます... (しかし、それはスプレッドシートと一致しません)

その通りです。現在のアイテムの数は、スプレッドシートの列の数と等しくありません。各回答が宛先シートで占める列の数には、フォームから削除された質問が含まれ、質問ではないアイテムは除外されます。また、スプレッドシートの列の順序は、質問が作成された順序です。フォームを再配置したり、新しい質問を挿入したりすると、スプレッドシートの列の順序は新しい順序を反映しません。

スプレッドシートの唯一の列がフォームからのものであると仮定すると、それらをどのように利用できるかは次のとおりです。

...
var data = respSheet.getDataRange().getValues(); // 2d array of form responses
var headers =  data[0];  // timestamp and all questions
var numColumns = headers.length;  // count headers
var numResponses = data.length - 1; // count responses

最後のポイントは正しいです。名前を関連付ける必要があります。

最後に、各質問をシートの各列に関連付ける方法はないと思いますが、何らかの方法で列名と項目のタイトルを比較することによって行います。

于 2013-05-27T15:34:33.953 に答える