1

誰でも私を助けることができますか?これは私のコードで、サーバー エラーが発生しました。少し待ってから、いつでも再試行してください。アイデアは、シートジェネリックと別のシートを取り、シートからジェネリックシートにすべてのデータをコピーすることです。

function importData(id){
  try{
    var sheet = SpreadsheetApp.openById(id);

    Logger.log("name of sheet: " + sheet.getName())

    var sheetToImport = sheet.getSheetByName("planilla para carga de datos");

    var sheetGeneric = DocsList.getFileById('0ArvYhlthIEV-dGxLOTI1MG5OSkI2SzRGRDhlendwcnc');

    var newSheet = sheetGeneric.makeCopy(sheet.getName()+" V2");

    var row = sheetToImport.getRange('A:Z');

    var range = row.getA1Notation();

    var values = row.getValues();

    var ss = SpreadsheetApp.openById(newSheet.getId()).getSheetByName("planilla para carga de datos");
    Logger.log("Valores a insertar:  " + values)
    var valuesNewSheet = ss.getRange(range).getValues();
    Logger.log("Rango: " + range + "valores del sheet antes: " + valuesNewSheet);
    ss.getRange(range).setValues(values);
    Logger.log("valores del sheet dsp: " + ss.getRange(range).getValues());
    Logger.log("new id: " + ss.getId());

  }catch(e){
    Logger.log("error: " + e )
    return;
  }

  return ss.getId();
}
4

1 に答える 1

3

コードを次のように変更すると、Sheet1 を含む単純な新しいスプレッドシートで機能しますが、makeCopy 呼び出し中にそのサーバー エラーが発生することもあります。そのための再試行を追加し、ss.getId() を含む行を newSheet.getId() に変更し、例外ロギングにスタック トレースを追加しました。

function importData(id){
  if (id==undefined) {
    id="0AowkhKY0KeQAdDZCMXZPb2VOc1NoN2pFZk9Qd0xHNGc";
  }
  try{
    var sheet = SpreadsheetApp.openById(id);
    Logger.log("name of sheet: " + sheet.getName())
    var sheetToImport = sheet.getSheetByName("Sheet1");
    var sheetGeneric = DocsList.getFileById('0AowkhKY0KeQAdEZ0NFBkXzdMY05VVWFRa0J2bVJvelE');
    var newSheet;
    retried (5,"Permanent error while trying to copy sheet", function () {
      newSheet = sheetGeneric.makeCopy(sheet.getName()+" V2");
    });
    var row = sheetToImport.getRange('A:Z');
    var range = row.getA1Notation();
    var values = row.getValues();
    var ss = SpreadsheetApp.openById(newSheet.getId()).getSheetByName("Sheet1");
    Logger.log("Valores a insertar:  " + values)
    var valuesNewSheet = ss.getRange(range).getValues();
    Logger.log("Rango: " + range + "valores del sheet antes: " + valuesNewSheet);
    ss.getRange(range).setValues(values);
    Logger.log("valores del sheet dsp: " + ss.getRange(range).getValues());
    Logger.log("new id: " + newSheet.getId());
  }catch(e){
    Logger.log("error: " + e +"\n"+e.stack)
    return;
  }
  return newSheet.getId();
}

このサーバーエラーは時々発生し、しばらくしてから再試行するとうまくいくことがよくあります。このような呼び出しを簡単に繰り返すには、次の関数が便利です。

function retried (maxRetries, msg, f) {
  var retries=0;
  do {
    try {
      f ();
      if (retries>0) {
        Logger.log ("succeeded after "+retries+" retries for "+f);
      }
      return; // success;
    }
    catch(err) { 
      Logger.log ("catched "+err.toString()+"\n"+err.stack);
      retries++;
      Utilities.sleep (5000);
    }
  } while (retries<maxRetries);
  Logger.log (msg);
  throw msg;
}

これは、上記のコードで makeCopy-call を再試行するために使用されます

于 2013-01-29T21:09:59.393 に答える