memorandums

日々のメモです。

GASファイルの復旧作業メモ

なんか(新しいことを)やると失敗します。

失敗したら何とかしようとするわけです。

何とかしょうとしたときの行動記録は、同じような過ちをした人の助けになるはずです。。たぶん。少なくとも(将来の)自分には。

そういう意味ではこのブログは失敗データベースとも言えるような気がしてきます。。。😁

■まえおき

さて、本題。といいながらまえおき。

1週間ほど前にASUSから以下のキャンペーンが切れるお知らせメールを受け取りました。

getnews.jp

一般ユーザの割当容量は15GBです。

とりあえず100GBが無くなっても納まっていたのですが、将来的に考えるとちょっと不安になりました。

幸い、数年前に大学がG Suiteを採用したため、大学アカウントであれば無制限の容量が使えます。

それまでの経緯もあり、通常は個人のGoogleアカウントを使ってきたのですが、ことDriveに関しては大学の方がいいな。。。と思い、そちらに移行しました。

個人アカウントでログインしてひたすらファイルをダウンロードして、大学のアカウントに切り替えてアップロードする感じです。

で、問題が発覚したのが、GAS(Google App Script)ファイルでした。

アップロードしたファイルは通常のテキストファイルになっているようで、GASとして認識してくれませんでした。。。壊れたかとヒヤッとしましたがテキストを開いてみるとそれらしいデータが入っているので一安心でした。

このGASは、非常勤の授業でファイル提出用のWebページをGASで作ったものでした。

ちなみに以下です。Google Formsでもアップロードできなくはないのですが、Googleにログインさせる必要があって、非常勤先の学生さんにそれをさせるのは難しいだろうな。。。と思って、GASを使った感じでした。

■コード.gs

function doGet() {
  return HtmlService.createHtmlOutputFromFile('index');
}

function processForm(formObject) {
  var folder = DriveApp.getFolderById('★アップロードするフォルダのIDをいれます★');
  var formBlob = formObject.myFile;
  folder.createFile(formBlob);
}

function getFiles() {
  var result = [];
  var folder = DriveApp.getFolderById('★アップロードするフォルダのIDをいれます★');
  var files = folder.getFiles()
  while(files.hasNext()){
    var loadFile = files.next();   
    var fileName = loadFile.getName();
    result.push(fileName);
  }
  return result.sort();
}

■index.html

<html lang="ja">
  <head>
    <meta charset="utf-8">
    <base target="_top">
    <script>
      // 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();
          });
        }
      }
      
      function loadFileList() {
        google.script.run.withSuccessHandler(updateFiles).getFiles();
      }
      
      window.addEventListener('load', preventFormSubmit);
      window.addEventListener('load', loadFileList);
      
      function handleFormSubmit(formObject) {
        var filepath = document.getElementById("myFile").value;
        console.debug(filepath);
        if (filepath == null || filepath == "") {
          alert("ファイルを選択してからアップロードボタンを押してください");
        } else {
          google.script.run.withSuccessHandler(updateMsg).processForm(formObject);
        }
      }
      
      function updateMsg(msg) {
        alert('アップロードが完了しました');
        //setTimeout(function() {
            loadFileList();
        //}, 1000);
      } 
      
      function updateFiles(msg) {
        var div = document.getElementById("files");
        var rst = "";
        for (var i = 0; i < msg.length; i++) {
          if (msg[i] == "upload") continue;
          rst += msg[i] + "<br/>";
        }
        div.innerHTML = rst;
      }
    </script>
    <title>課題提出用ページ</title>
  </head>
  
  
  <body>
    <h1>課題提出用ページ</h1>
    <span style="background-color:yellow;">「ファイルを選択」ボタンを押して、アップロードしたいファイルを選択し、「アップロード」ボタンを押してください。提出済みファイル一覧に表示されたら提出完了となります。</span>
    <div style="margin:20px; border-style: dotted; border-color:red; padding:20px;">
      <form id="myForm" onsubmit="handleFormSubmit(this)">
        <input id="myFile" name="myFile" type="file" value="" style=" font-size: 150%;"/>
        <input type="submit" value="アップロード" style=" font-size: 150%;" />
      </form>
    </div>
    
    <h2>提出済ファイル一覧</h2>
    <div id="files"></div>
  </body>
</html>

■本題

さて、復旧した手順を以下に示します。GASファイルをダウンロードしてしまい、そのファイルをGoogle Driveに再度アップロードして使う場合、という非常に特殊な状況からスタートです。

手元にダウンロードしたGASファイルがあるとします。

(1)GASファイルを開くとユニコード(\u0027など)らしきものが入っていることがわかりますので、これを変換します。変換するときには以下のページを使わせていただきました。

Unicode Escape Sequence | KWONLINE.ORG

(2)変換後の改行コードが\nと表示されていますので、これも改行文字に置き換えます。これにはvimを使いました。他にも手段があると思いますが。。。vimで以下の置換コマンドを実行すると改行されてコードが見やすくなります。

:s/\\n/\r/g

(3)あとは手作業になります。GASを新規作成し、上記の処理をしたファイルからそれらしい部分をコード.gsに転写します。さらに、index.htmlファイルを新規作成して、index.htmlの内容っぽいところをコピペします。

ただ、これだけですが。。。やったことがない作業だったので。。。壊れたと思っても何とかなるな。。。という感じです。

あと、本件とは違うGASアプリでFusion Tableもあったのですが、これはcsv形式になっていました。今年の授業ではもう使わないので。。。来年度までに時間をみつけて直したいと思います。

では。