terasima712
@terasima712 (ゆき 寺島)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

GASでオーナーのはずのGoogle Formにpermissionがない

GASでFormのオーナーなのにpermissionがない

GASにおいて、Google スプレッドシートからGoogle Formを作成し、その回答をまたスプレッドシートに書き込むようなコードを書いています。

発生している問題・エラー

Exception: No item with the given ID could be found. Possibly because you have not edited this item or you do not have permission to access it.

Writetosp()内のFormApp.openByUrlにおいて、「そのようなGoogle FormのURLは存在しないか権限がない」と言われます。Google FormはGASをもちいて生成したものですが、GASもGoogle Formもスプレッドシートもオーナーは私なのでアクセス権もあるはずです。

スプレッドシートの内容はこちら(になってほしい)です。
スクリーンショット 2023-02-07 151305.jpg

一列目に画像、二列目にGoogle FormのURL,三列目に回答を記載したいです。

自動生成したGoogle Formの内容はこちらです。
image.png

以下はGASのスクリプトです。

GoogleFormに回答があった時にスプレッドシートに記入するコード

function Writetosp() {
  // quizからURLをもらってその回答をまとめよう
  const sheet = SpreadsheetApp.openByUrl('既存のスプレッドシートのURL')
  .getSheetByName('シート1');

  //最後の行の2つ目のデータ(URL)を取得
  var rowIndex = sheet.getLastRow();

  var formURL = sheet.getRange(rowIndex, 2).getValues();
  // Sheetオブジェクト.getRange(行番号, 列番号, 行数, 列数)

  //google formを開く
  //[0][0]なのはformURLが二次元配列だから
  const form = FormApp.openByUrl(formURL[0][0]);

  // フォームの回答を取得
  const answer = form.response.getItemResponses();

  // 回答編集ページのURLを取得
  const editUrl = form.response.getEditResponseUrl();

  // スプレッドシートに書き込むデータ
  // プロパティ名はフォームのタイトル名と合わせてください
  // お好みでタイムスタンプをつけたり、回答編集ページのURLをつけたりもできます
  const data = {
    このコーディネートに点数を0から9で付けてください: "",
  };

  // 回答内容を取得
  for (let i = 0; i < answer.length; i++) {
    const title = answer[i].getItem().getTitle();

    // シートに書き込むデータを加工するところ
    data[title] = answer[i].getResponse();
  }


  // スプレッドシートに回答内容を書き込む
  sheet.getRange(sheet.getLastRow(),3).setValue(data);

}

GASを用いてGoogle Formを自動生成するコードも置いておきます。

スプレッドシートに編集があった際にGoogleFormを作成するコード

// トリガーはシートが編集されたときにしている
function createfashionimageFor_from_sp(){
  //シートの読み取り
  var sheet = SpreadsheetApp.openById('既存スプレッドシートのID')
  .getSheetByName('シート1');

  //最終行の1列目にある画像URLを取得
  var rowIndex = sheet.getLastRow();
  var colStartIndex = 1;
  var rowNum = 1;
  var img_array = sheet.getRange(rowIndex, colStartIndex, rowNum, 1).getValues();
  // Sheetオブジェクト.getRange(行番号, 列番号, 行数, 列数)

  var form =FormApp.create('GAS_from_sp');

  for (var i in img_array){
    img = UrlFetchApp.fetch(img_array[i])
    form.addImageItem()
      .setImage(img);
    //画像は今後複数表示する可能性があるのでforで書いておく
  }

  form.addListItem()
  .setTitle('この画像に点数を0から9で付けてください') //プルダウンリスト
  .setChoiceValues([0,1,2,3,4,5,6,7,8,9])
  .setRequired(true);

  // 公開用URLを取得
  var tmp = form.getPublishedUrl();

    // スプレッドシートに書き込み_内容を書き込み
  sheet.getRange(rowIndex,2).setValue(tmp);
    
}

自分で試したこと

プロパティからスコープなども確認しましたが、Formもspreadsheetもありました。

追記

なぜか唐突に治りました、、、。

0

3Answer

当てずっぽうですみませんが、getValue()(sなし)にしたら上手くいくのでは(その場合、[0][0]も削除しなきゃですけど)

0Like

Comments

  1. @terasima712

    Questioner

    ありがとうございます。試してみましたが、変わらないみたいです。

表示されているスクリプトを見ますと、作成したGoogle FormのURLとして、var tmp = form.getPublishedUrl()をスプレッドシートへ挿入していると思われます。もしもこのURLをFormApp.openByUrl(form.getPublishedUrl())に使用すると、今問題になっているエラーが発生するのではないかと思われます。

この場合、URLとしてFormApp.openByUrlで使用するために、次のような修正はいかがでしょうか。この修正ではcreatefashionimageFor_from_sp()を修正します。

From

var tmp = form.getPublishedUrl();

To

var tmp = form.getEditUrl();

別の修正パターンとして、もしもform.getPublishedUrl()のURLを別でも使用しているのであれば、次のような修正はいかがでしょうか。この場合、Writetosp()を修正します。

From

const form = FormApp.openByUrl(formURL[0][0]);

To

const form = FormApp.openById(formURL[0][0].split("/")[6]);
0Like

※コード自体は見ていない回答になります

試しにスプレッドシートの書き込み用の関数を一つ作ってみて単体で実行してみてはどうでしょう?
(私が以前に作ったサンプルで質問者さまの実装と異なる部分があり申し訳ないですがコード添付します)

function writeSpredSheet() {
  const ss = SpreadsheetApp.openByUrl("スプレッドシートのURL");
  // const ss = SpreadsheetApp.openById("スプレッドシートのID");

  const sheet = ss.getActiveSheet(); 
  const today = Utilities.formatDate(new Date(), "JST","yyyy/MM/dd");

  const range = sheet.getRange('A2:B2');
  range.setValues([[today, 123]]);
}

image.png

私の場合、新しくスプレッドシートとAppsScriptを作って実行してみたところ以下のような表示で権限を求められました。

2023-02-07_16h29_44.png
↓ウィンドウが開くので表示に従って許可
2023-02-07_16h29_58.png

2023-02-07_16h30_06.png

0Like

Your answer might help someone💌