0

スクリプトでフォームを再生成する機能を維持しながら、特定のフォーム URL を一貫して再利用する必要があります。そのために、フォーム データを削除する関数を作成しました。最初に、form.getItems() を実行していて、トピックにエラーが表示されていました。私はプログラマーではなく、コードが非常に非効率的である可能性が高いためだと考えて、ルーチンを書き直して、各 itemType と各項目の削除間の遅延を分割しました。これにより、ルーチンが信じられないほど遅くなりますが、Googleがそれを機能させることができれば、遅くても対処できます.

ここに私が現在持っているコードがありますが、残念ながら、まだ同じエラーが発生しています。私の問題は、実際には Google のバックエンドの問題ですか? それは私のコードですか?両方?

フォーム情報用のグローバル変数があります。

var formurl='*a url that works for me*'
var form=FormApp.openByUrl(formurl);

function DeleteFormItems() {
  var formcheckboxitems=form.getItems(FormApp.ItemType.CHECKBOX);
  var formdateitems=form.getItems(FormApp.ItemType.DATE);
  var formdatetimeitems=form.getItems(FormApp.ItemType.DATETIME);
  var formdurationitems=form.getItems(FormApp.ItemType.DURATION);
  var formgriditems=form.getItems(FormApp.ItemType.GRID);
  var formimageitems=form.getItems(FormApp.ItemType.IMAGE);
  var formlistitems=form.getItems(FormApp.ItemType.LIST);
  var formmultiplechoiceitems=form.getItems(FormApp.ItemType.MULTIPLE_CHOICE);
  var formpagebreakitems=form.getItems(FormApp.ItemType.PAGE_BREAK);
  var formparagraphtextitems=form.getItems(FormApp.ItemType.PARAGRAPH_TEXT);
  var formscaleitems=form.getItems(FormApp.ItemType.SCALE);
  var formsectionheaderitems=form.getItems(FormApp.ItemType.SECTION_HEADER);
  var formtextitems=form.getItems(FormApp.ItemType.TEXT);
  var formtimeitems=form.getItems(FormApp.ItemType.TIME);
  for (var i = formcheckboxitems.length-1; i >= 1; i--) {
    Utilities.sleep(2000)
    form.deleteItem(i);
  };
  for (var i = formdateitems.length-1; i >= 1; i--) {
    Utilities.sleep(2000)
    form.deleteItem(i);
  };
  for (var i = formdatetimeitems.length-1; i >= 1; i--) {
    Utilities.sleep(2000)
    form.deleteItem(i);
  };
  for (var i = formdurationitems.length-1; i >= 1; i--) {
    Utilities.sleep(2000)
    form.deleteItem(i);
  };
  for (var i = formgriditems.length-1; i >= 1; i--) {
    Utilities.sleep(2000)
    form.deleteItem(i);
  };
  for (var i = formimageitems.length-1; i >= 1; i--) {
    Utilities.sleep(2000)
    form.deleteItem(i);
  };
  for (var i = formlistitems.length-1; i >= 1; i--) {
    Utilities.sleep(2000)
    form.deleteItem(i);
  };
  for (var i = formmultiplechoiceitems.length-1; i >= 1; i--) {
    Utilities.sleep(2000)
    form.deleteItem(i);
  };
  for (var i = formparagraphtextitems.length-1; i >= 1; i--) {
    Utilities.sleep(2000)
    form.deleteItem(i);
  };
  for (var i = formscaleitems.length-1; i >= 1; i--) {
    Utilities.sleep(2000)
    form.deleteItem(i);
  };
  for (var i = formsectionheaderitems.length-1; i >= 1; i--) {
    Utilities.sleep(2000)
    form.deleteItem(i);
  };
  for (var i = formtextitems.length-1; i >= 1; i--) {
    Utilities.sleep(2000)
    form.deleteItem(i);
  };
  for (var i = formtimeitems.length-1; i >= 1; i--) {
    Utilities.sleep(2000)
    form.deleteItem(i);
  };
  for (var i = formpagebreakitems.length-1; i >= 1; i--) {
    Utilities.sleep(2000)
    form.deleteItem(i);
  };
}

これが私の更新されたスクリプトです。件名に記載されているエラーがまだ発生していますが、メッセージを取得する前にさらに進行します(いくつかのアイテムを削除します)。

var formurl='*a url that works for me*'
var form=FormApp.openByUrl(formurl);

function DeleteFormItems() {
  var formitems=form.getItems();
Logger.log('There are '+formitems.length+' total form items');
  for (var i = 1; i <= formitems.length-1; i++) {
    Utilities.sleep(2500)
    form.deleteItem(formitems[i]);
  };
}
4

2 に答える 2

5

ちょっと男、ついに同じ問題の回避策を見つけました。これを試して:

function clearForm(F){
   //var F = FormApp.openById("your form")
   var items= F.getItems().length;
   while(F.getItems().length!=0){        
     try{      
      F.deleteItem(0);
      } catch(error)
      {Logger.log(error);
      }
  }
}

エラーをスローせず、フォームを完全にクリーンアップします。「while」が「For」よりもうまく機能する理由は正直わかりません。for のように二重アクセスしないようです。

それがあなたにとって完璧に機能することを願っています!!!

https://stackoverflow.com/questions/tagged/google-apps-script

于 2013-11-25T22:45:47.573 に答える
1

私はこの同じエラーを抱えていました。私は最終的に、私が作成したリストと複数選択項目が「回答に基づいてページに移動する」に割り当てられていることを理解しました。が問題でした。それを修正するために、最初に削除したいすべてのリストと複数選択項目から選択肢を削除してから、これらの項目を削除しました。最後に、他のすべてのアイテムを削除しました。これまでのところ、これでエラーが発生することはありません。

function deleteTheFreakinForm(myForm){

  //First, remove list item choices. Then delete the list items.

  var listItems = form.getItems(FormApp.ItemType.LIST);

  while(itemIndex < listItems.length){
    listItems[itemIndex].asListItem().setChoiceValues(['']);
    form.deleteItem(listItems[itemIndex]);
    itemIndex++;
  }

  //Second, remove the multiple choice item choices. Then delete the multiple 
  //choice items.

  var multipleChoiceItems = form.getItems(FormApp.ItemType.MULTIPLE_CHOICE);
  itemIndex=0;
  while(itemIndex < multipleChoiceItems.length){
    multipleChoiceItems[itemIndex].asMultipleChoiceItem().setChoiceValues(['']);
    form.deleteItem(multipleChoiceItems[itemIndex]);
    itemIndex++;
  }

  //Finally, delete the remaining form items.

  var items = form.getItems();
  itemIndex=0;
  while(itemIndex < items.length){
    form.deleteItem(items[itemIndex]);
    itemIndex++;
  }
}
于 2014-06-29T13:54:32.457 に答える