質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.82%

GASで「関数 next が見つかりません。」のエラー

受付中

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 842

Khy

score 74

現在Google Apps Scriptでスプレッドシートのアドオンを作ろうとしているのですが、以下のコードを実行した所「オブジェクト Marker で関数 next が見つかりません。」というエラーが出てしまいました。

アドオンで作りたい機能は以下の通りです。
①音楽のソフトから書き出したデータファイルを読み込む(.txt形式)
②それをドライブにアップロード
③そのファイルからデータを取り出し、シートにまとめる

このうち②まではきちんと動作しております。
また③については、アップロード機能を搭載する前は同じコードできちんと動作しておりました。

まだGASを勉強し始めたばかりなので至らぬ点も多いかと思いますが、お知恵をお貸しいただけると助かります。
よろしくお願い致します。

<!--コード.gs -->

function onOpen(e) {
  Logger.log("onOpen");
  SpreadsheetApp.getUi().createAddonMenu()
      .addItem('Start', 'showSidebar')
      .addToUi();
}

function onInstall(e) {
  Logger.log("onInstall");
  onOpen(e);
}

function showSidebar() {
  Logger.log("showSidebar");
  var ui = HtmlService.createHtmlOutputFromFile('sidebar').setTitle('PT - CueSheet Maker');
  SpreadsheetApp.getUi().showSidebar(ui);
}




var fileId;
var folderId = "12345678901234567890"; //フォルダID入れる
var folder;

function processForm(theForm) {
  var fileBlob = theForm.myFile;
  folder = DriveApp.getFolderById(folderId);
  var doc = folder.createFile(fileBlob);

  //アップロード完了htmlを作成し、ページ内に呼び出す準備をする
  var template = HtmlService.createTemplateFromFile('Complete.html');  

  //アップロード完了html内のタグに作成したURLをセット
  template.fileUrl = doc.getUrl();
  fileId = doc.getId();

  //ページ内部にComplete.htmlの内容を呼び出す。
  return template.evaluate().getContent();
}





/////////////////////////////////////////
/////////////////////////////////////////
//////////   シートに書き込む   ///////////
/////////////////////////////////////////
/////////////////////////////////////////

function makeCue(){

  /////////////////////////////////
  //データのフォーマット
  ///////////////////////////////// 

  //.txtファイルのデータを改行で分割
  var contents = DriveApp.getFolderById(folderId)
                 .next()
                 .getFilesById(fileId)
                 .next()
                 .getBlob()
                 .getDataAsString("UTF-8")
                 .split(/[\n]/);
  //テキスト内の上12行を削除
  contents.splice(0, 12);

  for(var i = 0; i < contents.length-1; i++){
    //1行ずつ取り出し空白で区切る
    var marker = contents[i];
    marker = marker.split(/\s+/);
  }

  /////////////////////////////////
  //以下データの書き込み
  /////////////////////////////////  
  var sheet = SpreadsheetApp.getActiveSheet(); 
  sheet.getDataRange().setHorizontalAlignment("center");

  //table of contents
  sheet.getRange(1, 2).setValue('シーン');    
  sheet.getRange(1, 3).setValue('in'); 
  sheet.getRange(1, 4).setValue('out');        
  sheet.getRange(1, 6).setValue('inコメント'); 
  sheet.getRange(1, 7).setValue('outコメント');   

  var title      = [];  
  var inTime     = [];  
  var outTime    = [];  
  var inComment  = [];  
  var outComment = [];  

  for(var i=0; i < contents.length-1; i++){
    if(i == 0 || i%2 == 0){
    //set 'in' data      
     title.push([contents[i][4].slice(0, -3)]);
     inTime.push([contents[i][1].slice(0, -3)]);
     inComment.push([contents[i][5]]);      
    }else{
    //set 'out' data 
     outTime.push([contents[i][1].slice(0, -3)]);
     outComment.push([contents[i][5]]);          
    }
  }

  var len = (contents.length -1)/2;  

  for(var i=0; i < len; i++){
    sheet.getRange(2, 2, len, 1).setHorizontalAlignment("left");
  }    

  for(var i=0; i < len; i++){
    if(inComment[i] != '-'){
      sheet.getRange(i+2, 6).setHorizontalAlignment("left");
    }
  }  

  for(var i=0; i < len; i++){
    if(outComment[i] != '-'){
      sheet.getRange(i+2, 7).setHorizontalAlignment("left");
    }
  }    

  //write music number in sheet
  for(var i=1; i <= len; i++){
    sheet.getRange(i+1, 1).setValue('M'+ i);  
  }

  //write data in sheet
  sheet.getRange(2, 2, len, 1).setValues(title);     
  sheet.getRange(2, 3, len, 1).setValues(inTime);          
  sheet.getRange(2, 4, len, 1).setValues(outTime); 
  sheet.getRange(2, 6, len, 1).setValues(inComment);          
  sheet.getRange(2, 7, len, 1).setValues(outComment); 
}
<!--sidebar.html-->

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <link rel="stylesheet" href="https://ssl.gstatic.com/docs/script/css/add-ons1.css">    
   <script>
     //アップロードボタンクリック時のイベント
     function updateOutput(resultHtml) {
       //この関数が呼びだされる時点で、アップロード中・・・・ は完了しているので非表示に変更
       toggle_visibility('inProgress');

       //引数の resultHtml には、processForm(this.parentNode) の戻り値がセットされる。
       var outputDiv = document.getElementById('output');
       outputDiv.innerHTML = resultHtml;
     }
     //idタグ内の表示非表示の切り替え
     function toggle_visibility(id) {
       var e = document.getElementById(id);
       if(e.style.display == 'block')
         e.style.display = 'none';
       else
         e.style.display = 'block';
     }

      // Prevent forms from submitting.
      function preventFormSubmit() {
        var forms = document.querySelectorAll('form');
        for (var i = 0; i < forms.length; i++) {
          forms[i].addEventListener('submit', function(event) {
            event.preventDefault();
          });
        }
      }
      window.addEventListener('load', preventFormSubmit);  
   </script>    


  </head>
  <body>

    <h1>アップローダー</h1>

    <div id="formDiv">
      <!-- Form div will be hidden after form submission -->
      <form id="myForm">

        <div>
          <label>①ファイルを選択</label><br/>
          <input name="myFile" type="file" />
        </div><br/>

        <!--<div class="block" id="button-bar">-->
          <label>②アップロード</label><br/>        
          <input type="button" value="アップロード"
            onclick="toggle_visibility('inProgress');
              google.script.run
              .withSuccessHandler(updateOutput)
              .processForm(this.parentNode)" /><br/>

         <div id="inProgress" style="display: none;">アップロード中・・・・</div><br/>
         <div id="output"></div>

        <div class="block" id="button-bar">
          <label>③シートを作成</label><br/>        
          <input type="submit" class="blue" id="make-cue" value="シートを作成" onclick="preventFormSubmit()">
        </div>

      </form>
    </div>
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>    
    <script>
      /**
       * idがmake-cueのボタンを押したらコード.gsの関数を実行
       */
      $(function() {
        $('#make-cue').click(makeCue);
      });

      function makeCue() {
        this.disabled = true;

        $('#error').remove();
        var fileName = $('#fileName').val();
        google.script.run
            .withSuccessHandler(
              function(element) {
                //$('#idHelloMsg').val(retrunMsg);
                element.disabled = false;
              })
            .withFailureHandler(
              function(msg, element) {
                showError(msg, $('#button-bar'));
                element.disabled = false;
              })
            .withUserObject(this)
            .makeCue();
      }

      function showError(msg, element) {
        var div = $('<div id="error" class="error">' + msg + '</div>');
        $(element).after(div);
      }
    </script>    
  </body>
</html>
<!--Complete.html-->

<div>
    <h2>アップロード完了</h2>
    <!--File URL: <?= fileUrl ?><br/>-->
</div>

ちなみに.txtのファイル内容は以下のようになっております。

セッション名:    tst
サンプルレート:    48000.000000
ビットデプス:    24ビット
セッションスタートのタイムコード:    00:59:50:00
タイムコードフォーマット:    29.97フレーム
オーディオトラック数:    4
オーディオ クリップの数:    14
オーディオファイル数:    12


マーカー リスト
#       ロケーション           タイム リファレンス            単位           名前                                   コメント
7       01:01:09:12      3816000               サンプル         イントロ_in                              
16      01:01:36:26      5136000               サンプル         イントロ_out                             
8       01:05:28:04      16248000              サンプル         A_in                             
17      01:06:59:09      20628000              サンプル         A_out                            
1       01:13:22:20      39048000              サンプル         B_in                              
18      01:13:49:12      40332000              サンプル         B_out                             
31      01:15:43:08      45804000              サンプル         C_in                             
9       01:16:42:16      48650880              サンプル         C_out                            
32      01:21:09:02      61456800              サンプル         エンディング_in                                
10      01:21:45:03      63189120              サンプル         エンディング_out                                                   
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

とりあえず

  var contents = DriveApp.getFolderById(folderId)
                 .next()
//                 .getFilesById(fileId) //sはないはず
                 .getFileById(fileId)
//                 .next() //1個になってるのでnextはないはず
                 .getBlob()
                 .getDataAsString("UTF-8")
                 .split(/[\n]/);


のようにを直してはどうでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.82%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る