未経験のITエンジニア転職【テックキャンプ】

【クラウドワークス】承認前の記事データを一括ダウンロードするツール

【クラウドワーク】承認前の記事データを一括ダウンロードする方法

クラウドワークスのタスク募集は、短期間に大量記事を集めれるので便利です。

ただ大きなデメリットがあります。

クラウドワークス承認前データダウンロードできない
承認前に「形式を選んで内容を一括ダウンロード」ができない仕様になっています。

作業件数が多い場合、コピペチェックするために作業内容を個別にコピーするのは凄く時間が掛かります。

今回ご紹介するのは、承認前でも作業内容データを一括でダウンロードする方法です。無料ツール(iMacros)で作成しました。

ノーノちゃん

そんな方法あるんだ。いつも承認してからコピペチェックして非承認とブロックしていたよ。それしか方法ないと思ってた(T_T)
そうすると、コピペ職人さんにも料金払わないといけないので…そうしないでいい方法をご紹介しますね(*^^*)

テイくん

1. 必ず最初にお読みください

ワンクリックでデータが何件あっても抜き出せるようになっています。

それと「文字入力(一行、複数行)」と文字入力以外の「単一選択」の項目にも対応しています。

注意①
複数選択項目のみ最初の1つしか自動取得できません。
注意②
クラウドワークス側の作業一覧画面が変更された場合マクロが動かなくなるの可能性があります。
もしそうなった場合は、ご自分で修正されるかお問い合わせフォームから不具合報告をお願いします。

2. ツールを使うメリット

冒頭と少し重複する内容もありますが再度ご説明します。

2つのメリット
  1. コピペチェックの確認作業が大幅に短縮
  2. コピペ記事にお金を払わなくていい

それと作業効率を上げるための他のツールも組み合わせると、さらに時間短縮できます。

他のツールのプログラムはこちらから取得できます。
【無料】クラウドワークの「ありがとうボタン」を自動クリックするツールクラウドワークスの「ありがとうボタン」を一括で自動クリックするツール

3. 動作環境について

ツールを使うためにソフトをダウンロード(追加)する必要があります。

必要な2つのソフト(無料)
  1. iMacros 旧バージョン(8.9.7)
    最新版はJavaScriptが使用できないので旧バージョンが必要です。詳しく知りたい方は「iMacros:無料版と有料版の違いを解説」でご確認ください。
  2. Firefox(52.9.0ESR or 49.0.2)

上記の導入方法はこちらで説明しています(設定時間は約5分)
iMacrosの初期設定と導入方法iMacrosに必要なFirefox、SmoothCSVの導入方法と初期設定(保存版)【PART.1】

4. 更新履歴

修正や機能追加はこちらに記載しています。

  • 【macroExtract】内の作業者ページURL取得場所が間違えていたため修正
    var inLoopUrl = inLoop * 3 – 2; // 作業者ページURLの部分だけ個別要素がなく同じURLが3つあるため3づつ増える値が必要
    macroExtract += “TAG POS=”+inLoopUrl+” TYPE=A ATTR=HREF:/public/employees/* EXTRACT=HREF” + “\n”;
  • ガイドを表示【macroGuide】を削除
    複数の方から必要がないとのことで削除しました。
  • データを削除【macroDelete】を追加
    以前取得したデータは必要ないため最初から削除するマクロを追加しました。
    特に「非承認とブロックを自動化するツール」使う場合
  • ガイドを表示【macroGuide】を追加
  • Version情報をプログラムTOPに記載
  • 大幅なプログラムの簡略化

5. マクロの設置方法

マクロの中身をコピーして貼り付け、ファイル名を「cw-download.js」に変更するだけで動きます。

マクロ設置がはじめての方はこちらからどうぞ
【超初心者向け】2通りのマクロ設置方法を解説【超初心者向け】2通りのマクロ設置方法を解説

6. マクロの中身

cw-download.js
/*
Macro Name: cw-download.js
Macro URI: https://teilab.net/imacros-crowdworks-download/
Author: teilab(テイくん)
Version: 1.2
*/

// -------------------------------------------------
// Datasources内に「クラウドワークス」フォルダを作成
// -------------------------------------------------
var foldername = "クラウドワークス";
imns.FIO.makeDirectory(imns.Pref.getFilePref('defdatapath').path+"\\"+foldername);


// -------------------------------------------------
// データを削除【macroDelete】
// -------------------------------------------------
var macroDelete = "CODE:";
macroDelete += "SET !REPLAYSPEED FAST" + "\n";
macroDelete += "SET !ERRORIGNORE YES" + "\n";
macroDelete += "FILEDELETE NAME={{!FOLDER_DATASOURCE}}\\クラウドワークス\\crowdworks.csv" + "\n";
iimPlay(macroDelete);


// -------------------------------------------------
// 繰り返し処理開始
// -------------------------------------------------
for (var outLoop = 0; ; outLoop++) {
  for (var inLoop = 1; ; inLoop++) {
    // -------------------------------------------------
    // 取得データがあるかチェック【macroCheck】
    // -------------------------------------------------
    var macroCheck = "CODE:";
    macroCheck += "SET !REPLAYSPEED FAST" + "\n";
    macroCheck += "SET !ERRORIGNORE YES" + "\n";
    macroCheck += "TAB CLOSEALLOTHERS" + "\n"; // もしタブが開いたまま状態で動かすと止まるので必須
    macroCheck += "SET !TIMEOUT_STEP 0" + "\n";

    // データを取得するかユーザー名の部分で判定 ※重要
    macroCheck += "TAG POS="+inLoop+" TYPE=DIV ATTR=CLASS:username EXTRACT=TXT" + "\n"; // 抜き出した値をcheckに格納
    iimPlay(macroCheck);
    var check = iimGetExtract(1); // iimデータはjsで使えないため変数checkに渡す


    if (inLoop === 21) {
      // -------------------------------------------------
      // 次のページに移動【macroGoNext】
      // -------------------------------------------------
      var macroGoNext = "CODE:";
      macroGoNext += "SET !REPLAYSPEED FAST" + "\n";
      macroGoNext += "SET !ERRORIGNORE YES" + "\n";
      macroGoNext += "SET !TIMEOUT_STEP 1" + "\n";
      macroGoNext += "TAG POS=1 TYPE=A ATTR=REL:next*" + "\n";
      macroGoNext += "WAIT SECONDS=1"+ "\n";
      iimPlay(macroGoNext);
      break; // inLoopを抜ける


    } else if (check === "#EANF#") {
      // -------------------------------------------------
      // 全てのデータを取得した場合【macroEnd】
      // -------------------------------------------------
      var macroEnd = "CODE:";
      macroEnd += "PROMPT 全てのデータを取得しました!<br><br>※データは以下の場所に保存されています。<br>{{!FOLDER_DATASOURCE}}\\クラウドワークス\\crowdworks.csv<SP>" + "\n";
      macroEnd += "URL GOTO=file:{{!FOLDER_DATASOURCE}}\\クラウドワークス\\crowdworks.csv" + "\n"; // ファイルを開く
      iimPlay(macroEnd);
      iimClose();


    } else {
      // -------------------------------------------------
      // 作業ID 作業者 承認率、作業者ページURL、完了日時を取得【macroExtract】
      // -------------------------------------------------
      var inLoopUrl = inLoop * 3 - 2; // 作業者ページURLの部分だけ個別要素がなくほぼ同じURLが3つあるため3づつ増えるこの値が必要	  
      var macroExtract = "CODE:";
      macroExtract += "SET !REPLAYSPEED FAST" + "\n";
      macroExtract += "SET !ERRORIGNORE YES" + "\n";
      macroExtract += "SET !TIMEOUT_STEP 0" + "\n";

      // 作業ID
      macroExtract += "TAG POS="+inLoop+" TYPE=A ATTR=TXT:内容確認 EXTRACT=HREF" + "\n";
      macroExtract += "SET id EVAL(\"'{{!EXTRACT}}'.replace(/.*\\/(.*?).json/g,'$1');\")" + "\n"; // 作業ID以外を削除
      macroExtract += "SET !EXTRACT NULL" + "\n"; // !EXTRACTのデータを破棄 ※重要

      // 作業者
      macroExtract += "TAG POS="+inLoop+" TYPE=DIV ATTR=CLASS:username EXTRACT=TXT" + "\n";
      macroExtract += "SET username EVAL(\"'{{!EXTRACT}}'.replace(/ /g,'').replace(/\\s/g,'');\")" + "\n"; // 空白を削除
      macroExtract += "SET !EXTRACT NULL" + "\n";

      // 承認率
      macroExtract += "TAG POS="+inLoop+" TYPE=SPAN ATTR=CLASS:num_contracts EXTRACT=TXT" + "\n";
      macroExtract += "SET rate {{!EXTRACT}}" + "\n";
      macroExtract += "SET !EXTRACT NULL" + "\n";

      // 作業者ページURL
      macroExtract += "TAG POS="+inLoopUrl+" TYPE=A ATTR=HREF:/public/employees/* EXTRACT=HREF" + "\n";
      macroExtract += "SET url {{!EXTRACT}}" + "\n";
      macroExtract += "SET !EXTRACT NULL" + "\n";

      // 完了日時
      macroExtract += "TAG POS="+inLoop+" TYPE=TD ATTR=CLASS:completed_at EXTRACT=TXT" + "\n";
      macroExtract += "SET day {{!EXTRACT}}" + "\n";
      macroExtract += "SET !EXTRACT NULL" + "\n";

      // JavaScriptに受け渡すデータ取得エリア //
      macroExtract += "ADD !EXTRACT {{id}}" + "\n";        // 作業ID
      macroExtract += "ADD !EXTRACT {{username}}" + "\n";  // 作業者
      macroExtract += "ADD !EXTRACT {{rate}}" + "\n";      // 承認率
      macroExtract += "ADD !EXTRACT {{url}}" + "\n";       // 作業者ページURL
      macroExtract += "ADD !EXTRACT {{day}}" + "\n";       // 完了日時
      iimPlay(macroExtract);

      // JavaScriptにデータを受け渡す
      var allExtractDate = iimGetExtract(); // 作業ID、作業者、承認率、作業者ページURL、完了日時


      // -------------------------------------------------
      // 作業者ページURLに移動【macroGoTask】
      // -------------------------------------------------
      var macroGoTask = "CODE:";
      macroGoTask += "TAG POS="+inLoop+" TYPE=A ATTR=TXT:内容確認 EXTRACT=HREF" + "\n";
      macroGoTask += "SET url EVAL(\"'{{!EXTRACT}}'.replace(/(.*?).json/g,'$1');\")" + "\n";
      macroGoTask += "TAB OPEN" + "\n";
      macroGoTask += "TAB T=2" + "\n";
      macroGoTask += "URL GOTO={{url}}" + "\n";
      iimPlay(macroGoTask);


      for (var itemLoop = 1; ; itemLoop++) {
        // -------------------------------------------------
        // 作業内容データがあるかチェック【macroCheck2】
        // -------------------------------------------------
        var macroCheck2 = "CODE:";
        macroCheck2 += "SET !REPLAYSPEED FAST" + "\n";
        macroCheck2 += "SET !ERRORIGNORE YES" + "\n";
        macroCheck2 += "SET !TIMEOUT_STEP 0" + "\n"; // 遅延対策
        macroCheck2 += "TAG POS="+itemLoop+" TYPE=DIV ATTR=CLASS:label EXTRACT=TXT" + "\n";
        iimPlay(macroCheck2);
        var check2 = iimGetExtract(1);


        if (check2 === "#EANF#") {
          // -------------------------------------------------
          // CSVのデータを整理【macroOrganize】
          // -------------------------------------------------
          var macroOrganize = "CODE:";
          macroOrganize += "SET !REPLAYSPEED FAST" + "\n";
          macroOrganize += "SET !ERRORIGNORE NO" + "\n"; // データが無い場合止めるために必要

          // 全ての作業内容
          // 20項目まで取得できるように作成しているがそれ以上ある場合は増やす。
          macroOrganize += "SET !DATASOURCE {{!FOLDER_DATASOURCE}}\\クラウドワークス\\temp.csv" + "\n";
          macroOrganize += "SET !DATASOURCE_LINE 1" + "\n"; macroOrganize += "ADD !EXTRACT {{!COL1}}" + "\n";
          macroOrganize += "SET !DATASOURCE_LINE 2" + "\n"; macroOrganize += "ADD !EXTRACT {{!COL1}}" + "\n";
          macroOrganize += "SET !DATASOURCE_LINE 3" + "\n"; macroOrganize += "ADD !EXTRACT {{!COL1}}" + "\n";
          macroOrganize += "SET !DATASOURCE_LINE 4" + "\n"; macroOrganize += "ADD !EXTRACT {{!COL1}}" + "\n";
          macroOrganize += "SET !DATASOURCE_LINE 5" + "\n"; macroOrganize += "ADD !EXTRACT {{!COL1}}" + "\n";
          macroOrganize += "SET !DATASOURCE_LINE 6" + "\n"; macroOrganize += "ADD !EXTRACT {{!COL1}}" + "\n";
          macroOrganize += "SET !DATASOURCE_LINE 7" + "\n"; macroOrganize += "ADD !EXTRACT {{!COL1}}" + "\n";
          macroOrganize += "SET !DATASOURCE_LINE 8" + "\n"; macroOrganize += "ADD !EXTRACT {{!COL1}}" + "\n";
          macroOrganize += "SET !DATASOURCE_LINE 9" + "\n"; macroOrganize += "ADD !EXTRACT {{!COL1}}" + "\n";
          macroOrganize += "SET !DATASOURCE_LINE 10" + "\n"; macroOrganize += "ADD !EXTRACT {{!COL1}}" + "\n";
          macroOrganize += "SET !DATASOURCE_LINE 11" + "\n"; macroOrganize += "ADD !EXTRACT {{!COL1}}" + "\n";
          macroOrganize += "SET !DATASOURCE_LINE 12" + "\n"; macroOrganize += "ADD !EXTRACT {{!COL1}}" + "\n";
          macroOrganize += "SET !DATASOURCE_LINE 13" + "\n"; macroOrganize += "ADD !EXTRACT {{!COL1}}" + "\n";
          macroOrganize += "SET !DATASOURCE_LINE 14" + "\n"; macroOrganize += "ADD !EXTRACT {{!COL1}}" + "\n";
          macroOrganize += "SET !DATASOURCE_LINE 15" + "\n"; macroOrganize += "ADD !EXTRACT {{!COL1}}" + "\n";
          macroOrganize += "SET !DATASOURCE_LINE 16" + "\n"; macroOrganize += "ADD !EXTRACT {{!COL1}}" + "\n";
          macroOrganize += "SET !DATASOURCE_LINE 17" + "\n"; macroOrganize += "ADD !EXTRACT {{!COL1}}" + "\n";
          macroOrganize += "SET !DATASOURCE_LINE 18" + "\n"; macroOrganize += "ADD !EXTRACT {{!COL1}}" + "\n";
          macroOrganize += "SET !DATASOURCE_LINE 19" + "\n"; macroOrganize += "ADD !EXTRACT {{!COL1}}" + "\n";
          macroOrganize += "SET !DATASOURCE_LINE 20" + "\n"; macroOrganize += "ADD !EXTRACT {{!COL1}}" + "\n";
          iimPlay(macroOrganize);
          var allExtractDate2 = iimGetExtract();


          // -------------------------------------------------
          // CSVファイルに結果を書き込む【macroWriteCsv】
          // -------------------------------------------------
          var macroWriteCsv = "CODE:";
          macroWriteCsv += "SET !REPLAYSPEED FAST" + "\n";
          macroWriteCsv += "SET !ERRORIGNORE YES" + "\n";
          macroWriteCsv += "SET !TIMEOUT_STEP 0" + "\n"; // 遅延対策

          // CSVファイル書き込みエリア //
          macroWriteCsv += "ADD !EXTRACT {{allExtractDate}}" + "\n";  // 作業ID、作業者、承認率、作業者ページURL、完了日時
          macroWriteCsv += "ADD !EXTRACT " + "\n";                    // 判定用
          macroWriteCsv += "ADD !EXTRACT {{allExtractDate2}}" + "\n"; // 全ての作業内容

          // CSVファイルに保存
          macroWriteCsv += "SAVEAS TYPE=EXTRACT FOLDER={{!FOLDER_DATASOURCE}}\\クラウドワークス FILE=crowdworks.csv" + "\n";

          // tempファイル削除
          macroWriteCsv += "FILEDELETE NAME={{!FOLDER_DATASOURCE}}\\クラウドワークス\\temp.csv" + "\n";

          macroWriteCsv += "TAB CLOSE"+ "\n";
          macroWriteCsv += "TAB T=1"+ "\n";

          // ADDで変数をそのままEXTRACTに格納が不可のため一度セット
          iimSet("allExtractDate", allExtractDate);   // 作業ID、作業者、承認率、作業者ページURL、完了日時
          iimSet("allExtractDate2", allExtractDate2); // 全ての作業内容
          iimPlay(macroWriteCsv);
          break; // itemLoopを抜ける


        } else {
          // -------------------------------------------------
          // 作業内容を取得【macroExtract2】
          // -------------------------------------------------
          var macroExtract2 = "CODE:";
          macroExtract2 += "SET !REPLAYSPEED FAST" + "\n";
          macroExtract2 += "SET !ERRORIGNORE YES" + "\n";
          macroExtract2 += "SET !TIMEOUT_STEP 0" + "\n"; // 遅延対策

          // pとspanタグ両方のデータを抜き出しもし値がある場合はそのまま、値がない(#EANF#)場合は空白にする。
          // この方法にすることによってどんなデータでも対応できる。
          // 文字入力一行や複数行のデータ(pタグ)
          macroExtract2 += "TAG XPATH=//ul/li["+itemLoop+"]/p EXTRACT=TXT" + "\n";
          macroExtract2 += "SET itemP EVAL(\"var s='{{!EXTRACT}}'; var x; if(s!='#EANF#'){ x='{{!EXTRACT}}';} x\")" + "\n";
          macroExtract2 += "SET !EXTRACT NULL" + "\n";

          // 単一選択項目のデータ(spanタグ)
          macroExtract2 += "TAG XPATH=//ul/li["+itemLoop+"]//span EXTRACT=TXT" + "\n";
          macroExtract2 += "SET itemSpan EVAL(\"var s='{{!EXTRACT}}'; var x; if(s!='#EANF#'){ x='{{!EXTRACT}}';} x\")" + "\n";
          macroExtract2 += "SET !EXTRACT NULL" + "\n";

          // CSVファイル書き込みエリア //
          macroExtract2 += "ADD !EXTRACT {{itemP}}{{itemSpan}}" + "\n";

          // CSVファイルに一時的に保存 ※最終的にFILEDELETEで削除
          macroExtract2 += "SAVEAS TYPE=EXTRACT FOLDER={{!FOLDER_DATASOURCE}}\\クラウドワークス FILE=temp.csv" + "\n";
          iimPlay(macroExtract2);
        }
      }
    }
  }
}
注意
「基礎講座」の記事一覧内容とJavaScriptがある程度理解している中級者向けの解説です。ツールだけ使いたい方はこの項目をスキップしてください!

もしもiMacrosを1から勉強してみたい初心者の方はこちら
ブラウザ上の作業を全て自動化できるiMacrosブラウザ上の作業を全て自動化できるiMacrosとは?【PART.0】

    // -------------------------------------------------
    // 取得データがあるかチェック【macroCheck】
    // -------------------------------------------------
    var macroCheck = "CODE:";
    macroCheck += "SET !REPLAYSPEED FAST" + "\n";
    macroCheck += "SET !ERRORIGNORE YES" + "\n";
    macroCheck += "TAB CLOSEALLOTHERS" + "\n"; // もしタブが開いたまま状態で動かすと止まるので必須
    macroCheck += "SET !TIMEOUT_STEP 0" + "\n";

    // データを取得するかユーザー名の部分で判定 ※重要
    macroCheck += "TAG POS="+inLoop+" TYPE=DIV ATTR=CLASS:username EXTRACT=TXT" + "\n"; // 抜き出した値をcheckに格納
    iimPlay(macroCheck);
    var check = iimGetExtract(1); // iimデータはjsで使えないため変数checkに渡す

ユーザ名の部分を抜き出してJavaScriptに値をvar check = iimGetExtract(1)を使って受け渡します。

もしcheckの値が#EANF#(ユーザ名がない)場合は【macroEnd】でマクロを終了させます。

この方法の条件分岐は頻繁に使いますので覚えておきましょう。

    if (inLoop === 21) {
      // -------------------------------------------------
      // 次のページに移動【macroGoNext】
      // -------------------------------------------------
      var macroGoNext = "CODE:";
      macroGoNext += "SET !REPLAYSPEED FAST" + "\n";
      macroGoNext += "SET !ERRORIGNORE YES" + "\n";
      macroGoNext += "SET !TIMEOUT_STEP 1" + "\n";
      macroGoNext += "TAG POS=1 TYPE=A ATTR=REL:next*" + "\n";
      macroGoNext += "WAIT SECONDS=1"+ "\n";
      iimPlay(macroGoNext);
      break; // inLoopを抜ける

1ページ20件の案件が表示されているので、21回目に次のページに移動する処理です。

それとbreakinLoopから抜けるようにしています。

    } else if (check === "#EANF#") {
      // -------------------------------------------------
      // 全てのデータを取得した場合【macroEnd】
      // -------------------------------------------------
      var macroEnd = "CODE:";
      macroEnd += "PROMPT 全てのデータを取得しました!<br><br>※データは以下の場所に保存されています。<br>{{!FOLDER_DATASOURCE}}\\クラウドワークス\\crowdworks.csv<SP>" + "\n";
      macroEnd += "URL GOTO=file:{{!FOLDER_DATASOURCE}}\\クラウドワークス\\crowdworks.csv" + "\n"; // ファイルを開く
      iimPlay(macroEnd);
      iimClose();

取得するデータが無くなった場合にマクロを終了させる処理です。

変数checkは【macroCheck】で取得した値です

      // -------------------------------------------------
      // 作業内容データがあるかチェック【macroCheck2】
      // -------------------------------------------------
      for (var itemLoop = 1; ; itemLoop++) {
        var macroCheck2 = "CODE:";
        macroCheck2 += "SET !REPLAYSPEED FAST" + "\n";
        macroCheck2 += "SET !ERRORIGNORE YES" + "\n";
        macroCheck2 += "SET !TIMEOUT_STEP 0" + "\n"; // 遅延対策
        macroCheck2 += "TAG POS="+itemLoop+" TYPE=DIV ATTR=CLASS:label EXTRACT=TXT" + "\n";
        iimPlay(macroCheck2);
        var check2 = iimGetExtract(1);

項目のタイトルを抜き出してJavaScriptに値をvar check2 = iimGetExtract(1)を使って受け渡します。

データがある場合は【macroExtract2】で作業内容を取得します。

もしもcheck2の値が#EANF#(データがない)場合は【macroOrganize】を動かします。

    } else {
      // -------------------------------------------------
      // 作業ID 作業者 承認率、作業者ページURL、完了日時を取得【macroExtract】
      // -------------------------------------------------
      var macroExtract = "CODE:";
      macroExtract += "SET !REPLAYSPEED FAST" + "\n";
      macroExtract += "SET !ERRORIGNORE YES" + "\n";
      macroExtract += "SET !TIMEOUT_STEP 0" + "\n";

      // 作業ID
      macroExtract += "TAG POS="+inLoop+" TYPE=A ATTR=TXT:内容確認 EXTRACT=HREF" + "\n";
      macroExtract += "SET id EVAL(\"'{{!EXTRACT}}'.replace(/.*\\/(.*?).json/g,'$1');\")" + "\n"; // 作業ID以外を削除
      macroExtract += "SET !EXTRACT NULL" + "\n"; // !EXTRACTのデータを破棄 ※重要

      // 作業者
      macroExtract += "TAG POS="+inLoop+" TYPE=DIV ATTR=CLASS:username EXTRACT=TXT" + "\n";
      macroExtract += "SET username EVAL(\"'{{!EXTRACT}}'.replace(/ /g,'').replace(/\\s/g,'');\")" + "\n"; // 空白を削除
      macroExtract += "SET !EXTRACT NULL" + "\n";

      // 承認率
      macroExtract += "TAG POS="+inLoop+" TYPE=SPAN ATTR=CLASS:num_contracts EXTRACT=TXT" + "\n";
      macroExtract += "SET rate {{!EXTRACT}}" + "\n";
      macroExtract += "SET !EXTRACT NULL" + "\n";

      // 作業者ページURL
      macroExtract += "TAG POS="+inLoop+" TYPE=A ATTR=TXT:内容確認 EXTRACT=HREF" + "\n";
      macroExtract += "SET url EVAL(\"'{{!EXTRACT}}'.replace(/(.*?).json/g,'$1');\")" + "\n"; // 作業者ページURL以外を削除
      macroExtract += "SET !EXTRACT NULL" + "\n";

      // 完了日時
      macroExtract += "TAG POS="+inLoop+" TYPE=TD ATTR=CLASS:completed_at EXTRACT=TXT" + "\n";
      macroExtract += "SET day {{!EXTRACT}}" + "\n";
      macroExtract += "SET !EXTRACT NULL" + "\n";

      // JavaScriptに受け渡すデータ取得エリア //
      macroExtract += "ADD !EXTRACT {{id}}" + "\n";        // 作業ID
      macroExtract += "ADD !EXTRACT {{username}}" + "\n";  // 作業者
      macroExtract += "ADD !EXTRACT {{rate}}" + "\n";      // 承認率
      macroExtract += "ADD !EXTRACT {{url}}" + "\n";       // 作業者ページURL
      macroExtract += "ADD !EXTRACT {{day}}" + "\n";       // 完了日時
      iimPlay(macroExtract);

      // JavaScriptにデータを受け渡す
      var allExtractDate = iimGetExtract(); // 作業ID、作業者、承認率、作業者ページURL、完了日時

EVALで置き換えをした後のデータ抜き出す場合は、必ずSET !EXTRACT NULLでデータを破棄する必要があります。

もしも入れなかった場合、前のデータも一緒に抜き出しまうので注意が必要です。

最後にADD !EXTRACTで各データを全てJavaScriptにvar allExtractDate = iimGetExtract()を使って受け渡しをします。

      // -------------------------------------------------
      // 作業者ページURLに移動【macroGoTask】
      // -------------------------------------------------
      var macroGoTask = "CODE:";
      macroGoTask += "TAG POS="+inLoop+" TYPE=A ATTR=TXT:内容確認 EXTRACT=HREF" + "\n";
      macroGoTask += "SET url EVAL(\"'{{!EXTRACT}}'.replace(/(.*?).json/g,'$1');\")" + "\n";
      macroGoTask += "TAB OPEN" + "\n";
      macroGoTask += "TAB T=2" + "\n";
      macroGoTask += "URL GOTO={{url}}" + "\n";
      iimPlay(macroGoTask);

内容確認のボタンのリンク先URLは、jsonファイルになっているためEVALで置き換えます。
※直接jsonファイルのページURLからデータを抜き出すのはiMacrosでは不可です。
※内容確認のボタンをクリックしてポップアップで表示されるデータを取得することも可能ですが、読み込みが安定せずデータ取得が確実ではないためこの方法は採用しませんでした。

その後、新しいタブを開き、置き換えたタスクURLにアクセスします。

新規タブを開く理由は、BACKコマンドで戻ると余計な読み込みが発生するからです。

      // -------------------------------------------------
      // 作業内容データがあるかチェック【macroCheck2】
      // -------------------------------------------------
      for (var itemLoop = 1; ; itemLoop++) {
        var macroCheck2 = "CODE:";
        macroCheck2 += "SET !REPLAYSPEED FAST" + "\n";
        macroCheck2 += "SET !ERRORIGNORE YES" + "\n";
        macroCheck2 += "SET !TIMEOUT_STEP 0" + "\n"; // 遅延対策
        macroCheck2 += "TAG POS="+itemLoop+" TYPE=DIV ATTR=CLASS:label EXTRACT=TXT" + "\n";
        iimPlay(macroCheck2);
        var check2 = iimGetExtract(1);

項目のタイトルを抜き出してJavaScriptに値をvar check2 = iimGetExtract(1)を使って受け渡します。

データがある場合は【macroExtract2】で作業内容データを取得します。

もしもcheck2の値が#EANF#(データがない)場合は【macroOrganize】を動かします。

        if (check2 === "#EANF#") {
        // -------------------------------------------------
        // CSVのデータを整理【macroOrganize】
        // -------------------------------------------------
          var macroOrganize = "CODE:";
          macroOrganize += "SET !REPLAYSPEED FAST" + "\n";
          macroOrganize += "SET !ERRORIGNORE NO" + "\n"; // データが無い場合止めるために必要

          // 全ての作業内容
          // 20項目まで取得できるように作成しているがそれ以上ある場合は増やす。
          macroOrganize += "SET !DATASOURCE {{!FOLDER_DATASOURCE}}\\クラウドワークス\\temp.csv" + "\n";
          macroOrganize += "SET !DATASOURCE_LINE 1" + "\n"; macroOrganize += "ADD !EXTRACT {{!COL1}}" + "\n";
          macroOrganize += "SET !DATASOURCE_LINE 2" + "\n"; macroOrganize += "ADD !EXTRACT {{!COL1}}" + "\n";
          // ~中略~
          macroOrganize += "SET !DATASOURCE_LINE 19" + "\n"; macroOrganize += "ADD !EXTRACT {{!COL1}}" + "\n";
          macroOrganize += "SET !DATASOURCE_LINE 20" + "\n"; macroOrganize += "ADD !EXTRACT {{!COL1}}" + "\n";
          iimPlay(macroOrganize);
          var allExtractDate2 = iimGetExtract();

この部分はかなり特殊です。

【macroExtract2】で取得したtemp.csvに保管されているデータをADD !EXTRACTを使って順番に格納していきます。

ただ、依頼案件よって項目数が違うので、【macroExtract2】で取得した数のみデータを格納する必要が出てきます。

もしも1番最後(20行目)まで動かしてしまうと、CSVファイルに大量の空白セルが出てしまいます。

これ回避するためにSET !ERRORIGNORE NOを入れて途中で止めるようにしています。

上記で格納した全て値をJavaScriptにvar allExtractDate2 = iimGetExtract()を使って受け渡します。

          // -------------------------------------------------
          // CSVファイルに結果を書き込む【macroWriteCsv】
          // -------------------------------------------------
          var macroWriteCsv = "CODE:";
          macroWriteCsv += "SET !REPLAYSPEED FAST" + "\n";
          macroWriteCsv += "SET !ERRORIGNORE YES" + "\n";
          macroWriteCsv += "SET !TIMEOUT_STEP 0" + "\n"; // 遅延対策

          // CSVファイル書き込みエリア //
          macroWriteCsv += "ADD !EXTRACT {{allExtractDate}}" + "\n";  // 作業ID、作業者、承認率、作業者ページURL、完了日時
          macroWriteCsv += "ADD !EXTRACT " + "\n";                    // 判定用
          macroWriteCsv += "ADD !EXTRACT {{allExtractDate2}}" + "\n"; // 全ての作業内容

          // CSVファイルに保存
          macroWriteCsv += "SAVEAS TYPE=EXTRACT FOLDER={{!FOLDER_DATASOURCE}}\\クラウドワークス FILE=crowdworks.csv" + "\n";

          // tempファイル削除
          macroWriteCsv += "FILEDELETE NAME={{!FOLDER_DATASOURCE}}\\クラウドワークス\\temp.csv" + "\n";

          macroWriteCsv += "TAB CLOSE"+ "\n";
          macroWriteCsv += "TAB T=1"+ "\n";

          // ADDで変数をそのままEXTRACTに格納が不可のため一度セット
          iimSet("allExtractDate", allExtractDate);   // 作業ID、作業者、承認率、作業者ページURL、完了日時
          iimSet("allExtractDate2", allExtractDate2); // 全ての作業内容
          iimPlay(macroWriteCsv);
          break; // itemLoopを抜ける

2つのデータをCSVファイルに書き込みます。

  • 【macroExtract】でJavaScriptに受け渡したallExtractDateのデータ(作業ID、作業者、承認率、作業者ページURL、完了日時)
  • 【macroOrganize】でJavaScriptに受け渡したallExtractDate2のデータ(全ての作業内容)
    ※判定用は、次のページにある自動非承認をする時に使うので空白を作成しています。

その後【macroOrganize】で使ったtemp.csvファイルがいらないのでFILEDELETE削除します。

もしこのファイルを削除せずそのままにすると、前のデータもCSVに書き込んでしまいます。

イメージが付きにくい方は、一度この部分(macroWriteCsv += “FILEDELETE NAME={{!FOLDER_DATASOURCE}}\\クラウドワークス\\temp.csv” + “\n”;)を削除してマクロを回して確認しましょう。

        } else {
          // -------------------------------------------------
          // 作業内容を取得【macroExtract2】
          // -------------------------------------------------
          var macroExtract2 = "CODE:";
          macroExtract2 += "SET !REPLAYSPEED FAST" + "\n";
          macroExtract2 += "SET !ERRORIGNORE YES" + "\n";
          macroExtract2 += "SET !TIMEOUT_STEP 0" + "\n"; // 遅延対策

          // pとspanタグ両方のデータを抜き出しもし値がある場合はそのまま、値がない(#EANF#)場合は空白にする。
          // この方法にすることによってどんなデータでも対応できる。
          // 文字入力一行や複数行のデータ(pタグ)
          macroExtract2 += "TAG XPATH=//ul/li["+itemLoop+"]/p EXTRACT=TXT" + "\n";
          macroExtract2 += "SET itemP EVAL(\"var s='{{!EXTRACT}}'; var x; if(s!='#EANF#'){ x='{{!EXTRACT}}';} x\")" + "\n";
          macroExtract2 += "SET !EXTRACT NULL" + "\n";

          // 単一選択項目のデータ(spanタグ)
          macroExtract2 += "TAG XPATH=//ul/li["+itemLoop+"]//span EXTRACT=TXT" + "\n";
          macroExtract2 += "SET itemSpan EVAL(\"var s='{{!EXTRACT}}'; var x; if(s!='#EANF#'){ x='{{!EXTRACT}}';} x\")" + "\n";
          macroExtract2 += "SET !EXTRACT NULL" + "\n";

          // CSVファイル書き込みエリア //
          macroExtract2 += "ADD !EXTRACT {{itemP}}{{itemSpan}}" + "\n";

          // CSVファイルに一時的に保存 ※最終的にFILEDELETEで削除
          macroExtract2 += "SAVEAS TYPE=EXTRACT FOLDER={{!FOLDER_DATASOURCE}}\\クラウドワークス FILE=temp.csv" + "\n";
          iimPlay(macroExtract2);

タスクページのソースは2種類に分かれています。

  • 文字入力一行や複数行のデータ
  • 単一選択項目のデータ

もしもデータがない場合は#EANF#を取得しますので、そのまま抜き出してしまうと#EANF#がCSVファイルに書き込まれます。

回避するためにEVALで値が#EANF#の場合は空白に置き換えます。

その後、両方のデータをADD !EXTRACT {{itemP}}{{itemSpan}}でデータを統合して抜き出します。

分からないコマンドはこちらで確認しましょう
iMacrosコマンド一覧と使い方iMacros:コマンド一覧と使い方(大量のサンプルマクロあり)【PART.10】
補足
ページ内では全体のプログラムが見にくいので、Visual Studio Codeエディタなどにコピペして確認すると効率がいいです。

エディタを導入されていない方はこちらからどうぞ
【iMacros×JavaScript】Visual Studio Codeの導入方法と使い方iMacros×JavaScript:Visual Studio Codeの導入方法と使い方【PART.2】

7. マクロの使い方

※約1分の動画です。

STEP.1
案件を選ぶ
取得したい承認待ち案件を選びます。

承認前の記事データを一括ダウンロード手順

STEP.2
マクロを起動
承認前の記事データを一括ダウンロード手順
STEP.3
データ確認
取得したデータが自動で開きますので確認します。

承認前の記事データを一括ダウンロード手順

補足
毎回開くファイルを指定するのが面倒な方は「ポップアップ表示の場合」の設定をすれば非表示できます。
※動画内でも解説しています。

ポップアップ表示
これはデータを全て取得した後に表示されます。

8. よくある質問

マクロのラインを解析できません。

これはJavaScriptで作られたプログラムをiMacros(.iim)で処理しようとした場合に表示されるエラーです。
解決方法:ファイル名を「cw-download.js」に変更します。

imacrosError

LOOPボタンを使えるのはiMacros(.iim)ファイルだけです。JavaScript(.js)ファイルを使えばLOOPが使えます。

解決方法:画像の通りPlayを押せばOKです。

その場合以下の2つのケースがあります。

  1. クラウドワークス側のサーバーが混み合う時間帯
    解決方法:少し待ってから再度取得する
  2. Firefoxが原因でメモリ増加によりPCが重たくなっている ※特にFirefox 49.0.2
    解決方法:Firefoxを再起動する
作業中の方が複数にいる場合に極稀にデータが重複して取得します。

絶対に重複させたくない方は、全ての作業が完了した後にマクロを動かしてください。

以下の方法でコピペした後に数値を増やします。

クラウドワークで通常できない「承認前の内容データ」を一括ダウンロード

注意
他の場所を少しでも間違って削除すると、動かなくなるので慎重に追加しましょう。
このページのプログラムはJavaScriptで作成しているため勉強しないと難しいです。

もしiMacrosだけで作る場合は、iMacrosが自動でプログラムを作成してくれるので簡単です。

まずはこちらの記事を参考にして頂ければと思います。
iMacrosの使い方:初心者向けに解説iMacrosの使い方:初心者向けに解説!(図解、動画あり)【PART.2】

9. まとめ

このツールを使うこと、ライターさんから納品された記事確認の作業に集中できます。

サイト内でもご紹介した「ありがとうボタン」「非承認」の自動化ツールを使うとさらに効率化が可能です。

まとめ
  • クラウドワークスのタスク募集は短期間で大量の記事を集められる
  • ワンクリックで承認前の内容データを取得
  • 他の自動ツールと併用するとさらに効率化

クラウドワークスの他の自動ツールはこちらからどうぞ
【クラウドワークス】3つの無料自動ツールで外注化の効率アップを支援!【クラウドワークス】3つの無料自動ツールで外注化の効率アップを支援!